From d5e097ef64b158422ea9c3efbc5fdc1fe4224b67 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sat, 5 Mar 2016 19:36:43 +0000 Subject: [PATCH 001/369] initial import --- Zend/zend_API.c | 12 +- Zend/zend_API.h | 1 + Zend/zend_ast.h | 2 +- Zend/zend_compile.c | 77 ++- Zend/zend_compile.h | 2 + Zend/zend_language_parser.y | 8 +- Zend/zend_vm_def.h | 54 ++ Zend/zend_vm_execute.h | 918 ++++++++++++++++++++++++++++++++ ext/opcache/zend_persist.c | 4 + ext/opcache/zend_persist_calc.c | 3 + 10 files changed, 1071 insertions(+), 10 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 5ebfe2cb1782..bce2762f47d3 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3606,7 +3606,7 @@ ZEND_API const char *zend_get_module_version(const char *module_name) /* {{{ */ } /* }}} */ -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_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment, zend_uchar optional_type, zend_string *optional_type_name) /* {{{ */ { zend_property_info *property_info, *property_info_ptr; @@ -3676,12 +3676,22 @@ 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 = optional_type; + property_info->type_name = optional_type_name ? + zend_new_interned_string(optional_type_name) : NULL; + zend_hash_update_ptr(&ce->properties_info, name, property_info); return SUCCESS; } /* }}} */ +ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment) /* {{{ */ +{ + return zend_declare_typed_property_ex(ce, name, property, access_type, doc_comment, 0, NULL); +} +/* }}} */ + ZEND_API int zend_declare_property(zend_class_entry *ce, const char *name, size_t name_length, zval *property, int access_type) /* {{{ */ { zend_string *key = zend_string_init(name, name_length, ce->type & ZEND_INTERNAL_CLASS); diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 40c814f71dc8..e4fe6e4f13cf 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -314,6 +314,7 @@ ZEND_API zend_bool zend_is_callable(zval *callable, uint check_flags, zend_strin 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_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment, zend_uchar type, zend_string *type_name); 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); diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index ec771003c0c9..05a0c29dc451 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -140,12 +140,12 @@ enum _zend_ast_kind { ZEND_AST_TRY, ZEND_AST_CATCH, ZEND_AST_PARAM, - ZEND_AST_PROP_ELEM, ZEND_AST_CONST_ELEM, /* 4 child nodes */ ZEND_AST_FOR = 4 << ZEND_AST_NUM_CHILDREN_SHIFT, ZEND_AST_FOREACH, + ZEND_AST_PROP_ELEM, }; typedef uint16_t zend_ast_kind; diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 7cf00a0ebe09..34e96da85f96 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5298,6 +5298,40 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) /* {{{ */ } /* }}} */ + +/* +static void zend_compile_typename(zend_ast *ast, zend_arg_info *arg_info) +{ + if (ast->kind == ZEND_AST_TYPE) { + arg_info->type_hint = ast->attr; + } else { + zend_string *class_name = zend_ast_get_str(ast); + zend_uchar type = zend_lookup_builtin_type_by_name(class_name); + + if (type != 0) { + if (ast->attr != ZEND_NAME_NOT_FQ) { + zend_error_noreturn(E_COMPILE_ERROR, + "Scalar type declaration '%s' must be unqualified", + ZSTR_VAL(zend_string_tolower(class_name))); + } + arg_info->type_hint = type; + } else { + uint32_t fetch_type = zend_get_class_fetch_type_ast(ast); + if (fetch_type == ZEND_FETCH_CLASS_DEFAULT) { + class_name = zend_resolve_class_name_ast(ast); + zend_assert_valid_class_name(class_name); + } else { + zend_ensure_valid_class_fetch_type(fetch_type); + zend_string_addref(class_name); + } + + arg_info->type_hint = IS_OBJECT; + arg_info->class_name = class_name; + } + } +} +*/ + void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ { zend_ast_list *list = zend_ast_get_list(ast); @@ -5315,13 +5349,46 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ for (i = 0; i < children; ++i) { zend_ast *prop_ast = list->child[i]; - zend_ast *name_ast = prop_ast->child[0]; - zend_ast *value_ast = prop_ast->child[1]; - zend_ast *doc_comment_ast = prop_ast->child[2]; + zend_ast *type_ast = prop_ast->child[0]; + zend_ast *name_ast = prop_ast->child[1]; + zend_ast *value_ast = prop_ast->child[2]; + zend_ast *doc_comment_ast = prop_ast->child[3]; zend_string *name = zend_ast_get_str(name_ast); zend_string *doc_comment = NULL; zval value_zv; + zend_uchar optional_type = 0; + zend_string *optional_type_name = NULL; + if (type_ast) { + if (type_ast->kind == ZEND_AST_TYPE) { + optional_type = type_ast->attr; + } else { + zend_string *class_name = zend_ast_get_str(type_ast); + zend_uchar type = zend_lookup_builtin_type_by_name(class_name); + + if (type != 0) { + if (type_ast->attr != ZEND_NAME_NOT_FQ) { + zend_error_noreturn(E_COMPILE_ERROR, + "Scalar type declaration '%s' must be unqualified", + ZSTR_VAL(zend_string_tolower(class_name))); + } + optional_type = type; + } else { + uint32_t fetch_type = zend_get_class_fetch_type_ast(type_ast); + if (fetch_type == ZEND_FETCH_CLASS_DEFAULT) { + class_name = zend_resolve_class_name_ast(type_ast); + zend_assert_valid_class_name(class_name); + } else { + zend_ensure_valid_class_fetch_type(fetch_type); + zend_string_addref(class_name); + } + + optional_type = IS_OBJECT; + optional_type_name = class_name; + } + } + } + /* Doc comment has been appended as last element in ZEND_AST_PROP_ELEM ast */ if (doc_comment_ast) { doc_comment = zend_string_copy(zend_ast_get_str(doc_comment_ast)); @@ -5345,7 +5412,9 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ } name = zend_new_interned_string_safe(name); - zend_declare_property_ex(ce, name, &value_zv, flags, doc_comment); + if (optional_type) { + zend_declare_typed_property_ex(ce, name, &value_zv, flags, doc_comment, optional_type, optional_type_name); + } else zend_declare_property_ex(ce, name, &value_zv, flags, doc_comment); } } /* }}} */ diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index ecff23d1cdf9..6d2d1b7f46ce 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -299,6 +299,8 @@ typedef struct _zend_property_info { zend_string *name; zend_string *doc_comment; zend_class_entry *ce; + zend_uchar type; + zend_string *type_name; } zend_property_info; #define OBJ_PROP(obj, offset) \ diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index fd45f6275a1a..95ec36b82141 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -798,10 +798,10 @@ property_list: ; property: - T_VARIABLE backup_doc_comment - { $$ = zend_ast_create(ZEND_AST_PROP_ELEM, $1, NULL, ($2 ? zend_ast_create_zval_from_str($2) : NULL)); } - | T_VARIABLE '=' expr backup_doc_comment - { $$ = zend_ast_create(ZEND_AST_PROP_ELEM, $1, $3, ($4 ? zend_ast_create_zval_from_str($4) : NULL)); } + optional_type T_VARIABLE backup_doc_comment + { $$ = zend_ast_create(ZEND_AST_PROP_ELEM, $1, $2, NULL, ($3 ? zend_ast_create_zval_from_str($3) : NULL)); } + | optional_type T_VARIABLE '=' expr backup_doc_comment + { $$ = zend_ast_create(ZEND_AST_PROP_ELEM, $1, $2, $4, ($5 ? zend_ast_create_zval_from_str($5) : NULL)); } ; class_const_list: diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index de67318bed16..d42c910fd560 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1880,6 +1880,19 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) HANDLE_EXCEPTION(); } + /* not sure about this, sometimes container is reference to object */ + if (Z_TYPE_P(container) == IS_OBJECT) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -2041,6 +2054,18 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) property = GET_OP2_ZVAL_PTR(BP_VAR_R); + if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -2252,6 +2277,22 @@ ZEND_VM_C_LABEL(fast_assign_obj): ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -5845,6 +5886,19 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) break; } } + + if (Z_TYPE_P(offset) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 40d75a7d2704..d2acc59fc24d 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17513,6 +17513,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN HANDLE_EXCEPTION(); } + /* not sure about this, sometimes container is reference to object */ + if (Z_TYPE_P(container) == IS_OBJECT) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -17601,6 +17614,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST property = EX_CONSTANT(opline->op2); + if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -17768,6 +17793,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -17943,6 +17984,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -18118,6 +18175,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -18293,6 +18366,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -19225,6 +19314,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDL break; } } + + if (Z_TYPE_P(offset) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -21862,6 +21964,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE HANDLE_EXCEPTION(); } + /* not sure about this, sometimes container is reference to object */ + if (Z_TYPE_P(container) == IS_OBJECT) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -21950,6 +22065,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HA property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -22117,6 +22244,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -22292,6 +22435,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -22467,6 +22626,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -22642,6 +22817,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -23547,6 +23738,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER( break; } } + + if (Z_TYPE_P(offset) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -24407,6 +24611,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA HANDLE_EXCEPTION(); } + /* not sure about this, sometimes container is reference to object */ + if (Z_TYPE_P(container) == IS_OBJECT) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -24495,6 +24712,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVA property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -24662,6 +24891,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -24837,6 +25082,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -25012,6 +25273,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -25187,6 +25464,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -25982,6 +26275,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR_HAND break; } } + + if (Z_TYPE_P(offset) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -26736,6 +27042,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ HANDLE_EXCEPTION(); } + /* not sure about this, sometimes container is reference to object */ + if (Z_TYPE_P(container) == IS_OBJECT) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -26896,6 +27215,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CO property = EX_CONSTANT(opline->op2); + if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -27063,6 +27394,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -27238,6 +27585,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -27413,6 +27776,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -27588,6 +27967,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -28182,6 +28577,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HA break; } } + + if (Z_TYPE_P(offset) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -30033,6 +30441,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN HANDLE_EXCEPTION(); } + /* not sure about this, sometimes container is reference to object */ + if (Z_TYPE_P(container) == IS_OBJECT) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -30193,6 +30614,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -30360,6 +30793,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -30535,6 +30984,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -30710,6 +31175,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -30885,6 +31366,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -31353,6 +31850,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDL break; } } + + if (Z_TYPE_P(offset) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -32273,6 +32783,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR HANDLE_EXCEPTION(); } + /* not sure about this, sometimes container is reference to object */ + if (Z_TYPE_P(container) == IS_OBJECT) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -32434,6 +32957,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TM property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -32601,6 +33136,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -32776,6 +33327,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -32951,6 +33518,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -33126,6 +33709,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -33596,6 +34195,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR_H break; } } + + if (Z_TYPE_P(offset) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -37090,6 +37702,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND HANDLE_EXCEPTION(); } + /* not sure about this, sometimes container is reference to object */ + if (Z_TYPE_P(container) == IS_OBJECT) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -37250,6 +37875,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_ property = EX_CONSTANT(opline->op2); + if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -37461,6 +38098,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -37636,6 +38289,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -37811,6 +38480,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -37986,6 +38671,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -38998,6 +39699,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLE break; } } + + if (Z_TYPE_P(offset) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -43450,6 +44164,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER HANDLE_EXCEPTION(); } + /* not sure about this, sometimes container is reference to object */ + if (Z_TYPE_P(container) == IS_OBJECT) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -43610,6 +44337,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HAN property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -43777,6 +44516,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -43952,6 +44707,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -44127,6 +44898,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -44302,6 +45089,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -45310,6 +46113,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(Z break; } } + + if (Z_TYPE_P(offset) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -46981,6 +47797,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN HANDLE_EXCEPTION(); } + /* not sure about this, sometimes container is reference to object */ + if (Z_TYPE_P(container) == IS_OBJECT) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -47142,6 +47971,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -47309,6 +48150,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -47484,6 +48341,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -47659,6 +48532,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -47834,6 +48723,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } + if (Z_TYPE_P(property_name) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + + if (prop_info && prop_info->type) { + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + (prop_info->type != IS_OBJECT) ? + zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -48734,6 +49639,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMPVAR_HANDL break; } } + + if (Z_TYPE_P(offset) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must not be unset", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index 48fefd891817..77174cf4b1c5 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -714,6 +714,10 @@ static void zend_persist_property_info(zval *zv) prop->doc_comment = NULL; } } + + if (prop->type_name) { + zend_accel_store_string(prop->type_name); + } } static void zend_persist_class_constant(zval *zv) diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c index 22e74d6b36f1..3559125a25d3 100644 --- a/ext/opcache/zend_persist_calc.c +++ b/ext/opcache/zend_persist_calc.c @@ -288,6 +288,9 @@ static void zend_persist_property_info_calc(zval *zv) zend_shared_alloc_register_xlat_entry(prop, prop); ADD_ARENA_SIZE(sizeof(zend_property_info)); ADD_INTERNED_STRING(prop->name, 0); + if (prop->type_name) { + ADD_INTERNED_STRING(prop->type_name, 0); + } if (ZCG(accel_directives).save_comments && prop->doc_comment) { ADD_STRING(prop->doc_comment); } From 3b9c9ffc55fec9332ad4c5c6ea148bac94b0659f Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 6 Mar 2016 08:07:02 +0000 Subject: [PATCH 002/369] todos and whatever --- Zend/zend_API.c | 1 + Zend/zend_vm_def.h | 29 +- Zend/zend_vm_execute.h | 684 ++++++++++++++++++++++++++++++++++------- 3 files changed, 600 insertions(+), 114 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index bce2762f47d3..835c259ce98d 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3677,6 +3677,7 @@ ZEND_API int zend_declare_typed_property_ex(zend_class_entry *ce, zend_string *n property_info->doc_comment = doc_comment; property_info->ce = ce; property_info->type = optional_type; + /* TODO(krakjoe) this may leak, introduce dtor? */ property_info->type_name = optional_type_name ? zend_new_interned_string(optional_type_name) : NULL; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d42c910fd560..482f238b83c4 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1880,7 +1880,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) HANDLE_EXCEPTION(); } - /* not sure about this, sometimes container is reference to object */ + /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -2278,16 +2278,33 @@ ZEND_VM_C_LABEL(fast_assign_obj): } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index d2acc59fc24d..294735df7059 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17794,16 +17794,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -17985,16 +17998,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -18176,16 +18202,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -18367,16 +18406,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -22245,16 +22297,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -22436,16 +22501,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -22627,16 +22705,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -22818,16 +22909,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -24892,16 +24996,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -25083,16 +25200,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -25274,16 +25404,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -25465,16 +25608,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -27395,16 +27551,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -27586,16 +27755,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -27777,16 +27959,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -27968,16 +28163,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -30794,16 +31002,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -30985,16 +31206,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -31176,16 +31410,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -31367,16 +31614,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -33137,16 +33397,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -33328,16 +33601,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -33519,16 +33805,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -33710,16 +34009,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -38099,16 +38411,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -38290,16 +38615,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -38481,16 +38819,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -38672,16 +39023,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -44517,16 +44881,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -44708,16 +45085,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -44899,16 +45289,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -45090,16 +45493,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -48151,16 +48567,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -48342,16 +48771,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -48533,16 +48975,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } @@ -48724,16 +49179,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + /* TODO(krakjoe) check instanceof is sound */ + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(prop_info->type_name)); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - (prop_info->type != IS_OBJECT) ? - zend_get_type_by_const(prop_info->type) : ZSTR_VAL(prop_info->type_name)); + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } From e01685985aabaf636771c9aa1c071356f71ae7f4 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 6 Mar 2016 08:18:04 +0000 Subject: [PATCH 003/369] remove note --- Zend/zend_compile.c | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 34e96da85f96..b27896e7ba15 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5298,40 +5298,6 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) /* {{{ */ } /* }}} */ - -/* -static void zend_compile_typename(zend_ast *ast, zend_arg_info *arg_info) -{ - if (ast->kind == ZEND_AST_TYPE) { - arg_info->type_hint = ast->attr; - } else { - zend_string *class_name = zend_ast_get_str(ast); - zend_uchar type = zend_lookup_builtin_type_by_name(class_name); - - if (type != 0) { - if (ast->attr != ZEND_NAME_NOT_FQ) { - zend_error_noreturn(E_COMPILE_ERROR, - "Scalar type declaration '%s' must be unqualified", - ZSTR_VAL(zend_string_tolower(class_name))); - } - arg_info->type_hint = type; - } else { - uint32_t fetch_type = zend_get_class_fetch_type_ast(ast); - if (fetch_type == ZEND_FETCH_CLASS_DEFAULT) { - class_name = zend_resolve_class_name_ast(ast); - zend_assert_valid_class_name(class_name); - } else { - zend_ensure_valid_class_fetch_type(fetch_type); - zend_string_addref(class_name); - } - - arg_info->type_hint = IS_OBJECT; - arg_info->class_name = class_name; - } - } -} -*/ - void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ { zend_ast_list *list = zend_ast_get_list(ast); From 8f7463500ab49bd89137baf2c89ae249d0b858f7 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 6 Mar 2016 15:54:51 +0000 Subject: [PATCH 004/369] exception on uninitialized property access --- Zend/zend_vm_def.h | 16 ++ Zend/zend_vm_execute.h | 402 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 409 insertions(+), 9 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 482f238b83c4..faff99b0463d 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1858,6 +1858,22 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): } } while (0); + /* TODO(krakjoe) ce flags ? */ + if (Z_TYPE_P(offset) == IS_STRING) { + + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + FREE_OP2(); FREE_OP1(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 294735df7059..ddc75d638b45 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5605,6 +5605,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H } } while (0); + /* TODO(krakjoe) ce flags ? */ + if (Z_TYPE_P(offset) == IS_STRING) { + + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before being initialized", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -9351,6 +9367,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND } } while (0); + /* TODO(krakjoe) ce flags ? */ + if (Z_TYPE_P(offset) == IS_STRING) { + + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before being initialized", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -11149,6 +11181,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ } } while (0); + /* TODO(krakjoe) ce flags ? */ + if (Z_TYPE_P(offset) == IS_STRING) { + + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before being initialized", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -13061,6 +13109,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN } } while (0); + /* TODO(krakjoe) ce flags ? */ + if (Z_TYPE_P(offset) == IS_STRING) { + + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before being initialized", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -14283,6 +14347,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE } } while (0); + /* TODO(krakjoe) ce flags ? */ + if (Z_TYPE_P(offset) == IS_STRING) { + + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before being initialized", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -14806,6 +14886,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA } } while (0); + /* TODO(krakjoe) ce flags ? */ + if (Z_TYPE_P(offset) == IS_STRING) { + + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before being initialized", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + zval_ptr_dtor_nogc(free_op2); zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -17492,6 +17588,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN } } while (0); + /* TODO(krakjoe) ce flags ? */ + if (Z_TYPE_P(offset) == IS_STRING) { + + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before being initialized", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -17513,7 +17625,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN HANDLE_EXCEPTION(); } - /* not sure about this, sometimes container is reference to object */ + /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -17804,6 +17916,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -17812,6 +17926,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -18008,6 +18124,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -18016,6 +18134,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -18212,6 +18332,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -18220,6 +18342,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -18416,6 +18540,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -18424,6 +18550,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -21995,6 +22123,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE } } while (0); + /* TODO(krakjoe) ce flags ? */ + if (Z_TYPE_P(offset) == IS_STRING) { + + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before being initialized", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -22016,7 +22160,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE HANDLE_EXCEPTION(); } - /* not sure about this, sometimes container is reference to object */ + /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -22307,6 +22451,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -22315,6 +22461,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -22511,6 +22659,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -22519,6 +22669,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -22715,6 +22867,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -22723,6 +22877,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -22919,6 +23075,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -22927,6 +23085,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -24693,6 +24853,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA } } while (0); + /* TODO(krakjoe) ce flags ? */ + if (Z_TYPE_P(offset) == IS_STRING) { + + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before being initialized", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + zval_ptr_dtor_nogc(free_op2); zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -24715,7 +24891,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA HANDLE_EXCEPTION(); } - /* not sure about this, sometimes container is reference to object */ + /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -25006,6 +25182,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -25014,6 +25192,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -25210,6 +25390,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -25218,6 +25400,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -25414,6 +25598,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -25422,6 +25608,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -25618,6 +25806,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -25626,6 +25816,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -27177,6 +27369,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ } } while (0); + /* TODO(krakjoe) ce flags ? */ + if (Z_TYPE_P(offset) == IS_STRING) { + + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before being initialized", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -27198,7 +27406,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ HANDLE_EXCEPTION(); } - /* not sure about this, sometimes container is reference to object */ + /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -27561,6 +27769,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -27569,6 +27779,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -27765,6 +27977,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -27773,6 +27987,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -27969,6 +28185,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -27977,6 +28195,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -28173,6 +28393,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -28181,6 +28403,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -30628,6 +30852,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN } } while (0); + /* TODO(krakjoe) ce flags ? */ + if (Z_TYPE_P(offset) == IS_STRING) { + + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before being initialized", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -30649,7 +30889,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN HANDLE_EXCEPTION(); } - /* not sure about this, sometimes container is reference to object */ + /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -31012,6 +31252,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -31020,6 +31262,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -31216,6 +31460,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -31224,6 +31470,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -31420,6 +31668,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -31428,6 +31678,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -31624,6 +31876,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -31632,6 +31886,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -33021,6 +33277,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR } } while (0); + /* TODO(krakjoe) ce flags ? */ + if (Z_TYPE_P(offset) == IS_STRING) { + + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before being initialized", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -33043,7 +33315,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR HANDLE_EXCEPTION(); } - /* not sure about this, sometimes container is reference to object */ + /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -33407,6 +33679,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -33415,6 +33689,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -33611,6 +33887,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -33619,6 +33897,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -33815,6 +34095,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -33823,6 +34105,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -34019,6 +34303,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -34027,6 +34313,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -37993,6 +38281,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND } } while (0); + /* TODO(krakjoe) ce flags ? */ + if (Z_TYPE_P(offset) == IS_STRING) { + + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before being initialized", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -38014,7 +38318,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND HANDLE_EXCEPTION(); } - /* not sure about this, sometimes container is reference to object */ + /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -38421,6 +38725,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -38429,6 +38735,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -38625,6 +38933,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -38633,6 +38943,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -38829,6 +39141,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -38837,6 +39151,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -39033,6 +39349,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -39041,6 +39359,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -44507,6 +44827,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER } } while (0); + /* TODO(krakjoe) ce flags ? */ + if (Z_TYPE_P(offset) == IS_STRING) { + + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before being initialized", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -44528,7 +44864,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER HANDLE_EXCEPTION(); } - /* not sure about this, sometimes container is reference to object */ + /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -44891,6 +45227,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -44899,6 +45237,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -45095,6 +45435,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -45103,6 +45445,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -45299,6 +45643,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -45307,6 +45653,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -45503,6 +45851,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -45511,6 +45861,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -48191,6 +48543,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN } } while (0); + /* TODO(krakjoe) ce flags ? */ + if (Z_TYPE_P(offset) == IS_STRING) { + + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before being initialized", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } + } + zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -48213,7 +48581,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN HANDLE_EXCEPTION(); } - /* not sure about this, sometimes container is reference to object */ + /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -48577,6 +48945,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -48585,6 +48955,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -48781,6 +49153,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -48789,6 +49163,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -48985,6 +49361,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -48993,6 +49371,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), @@ -49189,6 +49569,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s", ZSTR_VAL(prop_info->ce->name), @@ -49197,6 +49579,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + + /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", ZSTR_VAL(prop_info->ce->name), From 70e0e4d7832a211da178aae3bd5513cf67aedd90 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 6 Mar 2016 18:24:47 +0000 Subject: [PATCH 005/369] be tidy, don't leak, use flags ... other things, probably --- Zend/zend_API.c | 2 + Zend/zend_inheritance.c | 8 ++ Zend/zend_vm_def.h | 15 ++- Zend/zend_vm_execute.h | 268 ++++++++++++++++++++++++++++------------ 4 files changed, 207 insertions(+), 86 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 835c259ce98d..a629a5e33716 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3683,6 +3683,8 @@ ZEND_API int zend_declare_typed_property_ex(zend_class_entry *ce, zend_string *n zend_hash_update_ptr(&ce->properties_info, name, property_info); + ce->ce_flags |= ZEND_ACC_HAS_TYPE_HINTS; + return SUCCESS; } /* }}} */ diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index e3ef6a699187..8952661d8a13 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -41,6 +41,10 @@ static zend_property_info *zend_duplicate_property_info(zend_property_info *prop if (new_property_info->doc_comment) { zend_string_addref(new_property_info->doc_comment); } + if (new_property_info->type_name) { + zend_string_addref(new_property_info->type_name); + } + return new_property_info; } /* }}} */ @@ -50,6 +54,10 @@ static zend_property_info *zend_duplicate_property_info_internal(zend_property_i zend_property_info* new_property_info = pemalloc(sizeof(zend_property_info), 1); memcpy(new_property_info, property_info, sizeof(zend_property_info)); zend_string_addref(new_property_info->name); + if (new_property_info->type_name) { + zend_string_addref(new_property_info->type_name); + } + return new_property_info; } /* }}} */ diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index faff99b0463d..13842488a2fa 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1849,6 +1849,7 @@ ZEND_VM_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR ZEND_VM_C_LABEL(fetch_obj_r_no_object): zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); + ZEND_VM_C_GOTO(fetch_obj_r_exit); } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -1859,7 +1860,8 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): } while (0); /* TODO(krakjoe) ce flags ? */ - if (Z_TYPE_P(offset) == IS_STRING) { + if (OP2_TYPE == IS_CONST && + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -1867,13 +1869,15 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", + "%s::$%s accessed before initialization (%s)", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); + Z_STRVAL_P(offset), + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } +ZEND_VM_C_LABEL(fetch_obj_r_exit): FREE_OP2(); FREE_OP1(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -2293,7 +2297,8 @@ ZEND_VM_C_LABEL(fast_assign_obj): ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (OP2_TYPE == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -2318,7 +2323,7 @@ ZEND_VM_C_LABEL(fast_assign_obj): /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s", - ZSTR_VAL(prop_info->ce->name), + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index ddc75d638b45..50892bc548bb 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5596,6 +5596,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); + goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -5606,7 +5607,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H } while (0); /* TODO(krakjoe) ce flags ? */ - if (Z_TYPE_P(offset) == IS_STRING) { + if (IS_CONST == IS_CONST && + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -5614,13 +5616,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before being initialized", + "%s::$%s accessed before initialization (%s)", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); + Z_STRVAL_P(offset), + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } +fetch_obj_r_exit: + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -9358,6 +9363,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); + goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -9368,7 +9374,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND } while (0); /* TODO(krakjoe) ce flags ? */ - if (Z_TYPE_P(offset) == IS_STRING) { + if (IS_CV == IS_CONST && + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -9376,13 +9383,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before being initialized", + "%s::$%s accessed before initialization (%s)", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); + Z_STRVAL_P(offset), + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } +fetch_obj_r_exit: + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -11172,6 +11182,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); + goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -11182,7 +11193,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ } while (0); /* TODO(krakjoe) ce flags ? */ - if (Z_TYPE_P(offset) == IS_STRING) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST && + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -11190,13 +11202,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before being initialized", + "%s::$%s accessed before initialization (%s)", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); + Z_STRVAL_P(offset), + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } +fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -13100,6 +13114,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); + goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -13110,7 +13125,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN } while (0); /* TODO(krakjoe) ce flags ? */ - if (Z_TYPE_P(offset) == IS_STRING) { + if (IS_CONST == IS_CONST && + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -13118,13 +13134,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before being initialized", + "%s::$%s accessed before initialization (%s)", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); + Z_STRVAL_P(offset), + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } +fetch_obj_r_exit: + zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -14338,6 +14357,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); + goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -14348,7 +14368,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE } while (0); /* TODO(krakjoe) ce flags ? */ - if (Z_TYPE_P(offset) == IS_STRING) { + if (IS_CV == IS_CONST && + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -14356,13 +14377,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before being initialized", + "%s::$%s accessed before initialization (%s)", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); + Z_STRVAL_P(offset), + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } +fetch_obj_r_exit: + zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -14877,6 +14901,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); + goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -14887,7 +14912,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA } while (0); /* TODO(krakjoe) ce flags ? */ - if (Z_TYPE_P(offset) == IS_STRING) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST && + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -14895,13 +14921,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before being initialized", + "%s::$%s accessed before initialization (%s)", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); + Z_STRVAL_P(offset), + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } +fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op2); zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -17579,6 +17607,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); + goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -17589,7 +17618,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN } while (0); /* TODO(krakjoe) ce flags ? */ - if (Z_TYPE_P(offset) == IS_STRING) { + if (IS_CONST == IS_CONST && + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -17597,13 +17627,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before being initialized", + "%s::$%s accessed before initialization (%s)", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); + Z_STRVAL_P(offset), + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } +fetch_obj_r_exit: + zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -17905,7 +17938,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CONST == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -18113,7 +18147,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CONST == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -18321,7 +18356,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CONST == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -18529,7 +18565,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CONST == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -22114,6 +22151,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); + goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -22124,7 +22162,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE } while (0); /* TODO(krakjoe) ce flags ? */ - if (Z_TYPE_P(offset) == IS_STRING) { + if (IS_CV == IS_CONST && + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -22132,13 +22171,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before being initialized", + "%s::$%s accessed before initialization (%s)", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); + Z_STRVAL_P(offset), + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } +fetch_obj_r_exit: + zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -22440,7 +22482,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CV == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -22648,7 +22691,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CV == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -22856,7 +22900,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CV == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -23064,7 +23109,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CV == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -24844,6 +24890,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); + goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -24854,7 +24901,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA } while (0); /* TODO(krakjoe) ce flags ? */ - if (Z_TYPE_P(offset) == IS_STRING) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST && + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -24862,13 +24910,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before being initialized", + "%s::$%s accessed before initialization (%s)", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); + Z_STRVAL_P(offset), + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } +fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op2); zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -25171,7 +25221,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -25379,7 +25430,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -25587,7 +25639,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -25795,7 +25848,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -27360,6 +27414,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); + goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -27370,7 +27425,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ } while (0); /* TODO(krakjoe) ce flags ? */ - if (Z_TYPE_P(offset) == IS_STRING) { + if (IS_CONST == IS_CONST && + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -27378,13 +27434,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before being initialized", + "%s::$%s accessed before initialization (%s)", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); + Z_STRVAL_P(offset), + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } +fetch_obj_r_exit: + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -27758,7 +27817,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CONST == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -27966,7 +28026,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CONST == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -28174,7 +28235,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CONST == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -28382,7 +28444,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CONST == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -30843,6 +30906,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); + goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -30853,7 +30917,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN } while (0); /* TODO(krakjoe) ce flags ? */ - if (Z_TYPE_P(offset) == IS_STRING) { + if (IS_CV == IS_CONST && + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -30861,13 +30926,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before being initialized", + "%s::$%s accessed before initialization (%s)", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); + Z_STRVAL_P(offset), + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } +fetch_obj_r_exit: + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -31241,7 +31309,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CV == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -31449,7 +31518,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CV == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -31657,7 +31727,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CV == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -31865,7 +31936,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CV == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -33268,6 +33340,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); + goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -33278,7 +33351,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR } while (0); /* TODO(krakjoe) ce flags ? */ - if (Z_TYPE_P(offset) == IS_STRING) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST && + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -33286,13 +33360,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before being initialized", + "%s::$%s accessed before initialization (%s)", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); + Z_STRVAL_P(offset), + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } +fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -33668,7 +33744,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -33876,7 +33953,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -34084,7 +34162,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -34292,7 +34371,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -38272,6 +38352,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); + goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -38282,7 +38363,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND } while (0); /* TODO(krakjoe) ce flags ? */ - if (Z_TYPE_P(offset) == IS_STRING) { + if (IS_CONST == IS_CONST && + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -38290,13 +38372,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before being initialized", + "%s::$%s accessed before initialization (%s)", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); + Z_STRVAL_P(offset), + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } +fetch_obj_r_exit: + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -38714,7 +38799,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CONST == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -38922,7 +39008,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CONST == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -39130,7 +39217,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CONST == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -39338,7 +39426,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CONST == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -44818,6 +44907,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); + goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -44828,7 +44918,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER } while (0); /* TODO(krakjoe) ce flags ? */ - if (Z_TYPE_P(offset) == IS_STRING) { + if (IS_CV == IS_CONST && + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -44836,13 +44927,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before being initialized", + "%s::$%s accessed before initialization (%s)", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); + Z_STRVAL_P(offset), + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } +fetch_obj_r_exit: + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -45216,7 +45310,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CV == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -45424,7 +45519,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CV == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -45632,7 +45728,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CV == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -45840,7 +45937,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if (IS_CV == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -48534,6 +48632,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); + goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -48544,7 +48643,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN } while (0); /* TODO(krakjoe) ce flags ? */ - if (Z_TYPE_P(offset) == IS_STRING) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST && + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -48552,13 +48652,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before being initialized", + "%s::$%s accessed before initialization (%s)", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); + Z_STRVAL_P(offset), + zend_get_type_by_const(prop_info->type)); HANDLE_EXCEPTION(); } } +fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -48934,7 +49036,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -49142,7 +49245,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -49350,7 +49454,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); @@ -49558,7 +49663,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - if (Z_TYPE_P(property_name) == IS_STRING) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST && + UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { /* TODO(krakjoe) needs a cache slot */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); From 5a07809ff40153533cc3322e1e96df88e57223a3 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 6 Mar 2016 18:34:15 +0000 Subject: [PATCH 006/369] some tests ... --- .../typed_properties_001.phpt | 38 ++++++++++ .../typed_properties_002.phpt | 17 +++++ .../typed_properties_003.phpt | 17 +++++ .../typed_properties_004.phpt | 20 +++++ Zend/zend_vm_def.h | 5 +- Zend/zend_vm_execute.h | 75 ++++++++----------- 6 files changed, 124 insertions(+), 48 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_001.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_002.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_003.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_004.phpt 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 000000000000..054fc4df3ba6 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_001.phpt @@ -0,0 +1,38 @@ +--TEST-- +Test typed properties basic operation +--FILE-- +int = $int; + $this->float = $float; + $this->bool = $bool; + $this->array = $array; + $this->std = $std; + } +}); +?> +--EXPECTF-- +object(class@anonymous)#%d (5) { + ["int"]=> + int(1) + ["float"]=> + float(2.2) + ["bool"]=> + bool(true) + ["array"]=> + array(1) { + [0]=> + string(4) "four" + } + ["std"]=> + object(stdClass)#%d (0) { + } +} + 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 000000000000..a046d792ca8a --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_002.phpt @@ -0,0 +1,17 @@ +--TEST-- +Test typed properties error condition (read uninitialized) +--FILE-- +int); +?> +--EXPECTF-- +Fatal error: Uncaught TypeError: class@anonymous::$int 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 000000000000..b2743a9adcee --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_003.phpt @@ -0,0 +1,17 @@ +--TEST-- +Test typed properties error condition (fetch reference) +--FILE-- +int; +?> +--EXPECTF-- +Fatal error: Uncaught TypeError: fetching reference to class@anonymous::$int is disallowed in %s:6 +Stack trace: +#0 {main} + thrown in %s on line 6 + + 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 000000000000..668b518d82ae --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_004.phpt @@ -0,0 +1,20 @@ +--TEST-- +Test typed properties error condition (type mismatch) +--FILE-- +int = $string; + } +}; +?> +--EXPECTF-- +Fatal error: Uncaught TypeError: class@anonymous::$int must be integer 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/zend_vm_def.h b/Zend/zend_vm_def.h index 13842488a2fa..8528008f64b8 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1869,10 +1869,9 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization (%s)", + "%s::$%s accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset), - zend_get_type_by_const(prop_info->type)); + Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 50892bc548bb..6a89f40566a0 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5616,10 +5616,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization (%s)", + "%s::$%s accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset), - zend_get_type_by_const(prop_info->type)); + Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } } @@ -9383,10 +9382,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization (%s)", + "%s::$%s accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset), - zend_get_type_by_const(prop_info->type)); + Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } } @@ -11202,10 +11200,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization (%s)", + "%s::$%s accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset), - zend_get_type_by_const(prop_info->type)); + Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } } @@ -13134,10 +13131,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization (%s)", + "%s::$%s accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset), - zend_get_type_by_const(prop_info->type)); + Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } } @@ -14377,10 +14373,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization (%s)", + "%s::$%s accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset), - zend_get_type_by_const(prop_info->type)); + Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } } @@ -14921,10 +14916,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization (%s)", + "%s::$%s accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset), - zend_get_type_by_const(prop_info->type)); + Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } } @@ -17627,10 +17621,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization (%s)", + "%s::$%s accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset), - zend_get_type_by_const(prop_info->type)); + Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } } @@ -22171,10 +22164,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization (%s)", + "%s::$%s accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset), - zend_get_type_by_const(prop_info->type)); + Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } } @@ -24910,10 +24902,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization (%s)", + "%s::$%s accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset), - zend_get_type_by_const(prop_info->type)); + Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } } @@ -27434,10 +27425,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization (%s)", + "%s::$%s accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset), - zend_get_type_by_const(prop_info->type)); + Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } } @@ -30926,10 +30916,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization (%s)", + "%s::$%s accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset), - zend_get_type_by_const(prop_info->type)); + Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } } @@ -33360,10 +33349,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization (%s)", + "%s::$%s accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset), - zend_get_type_by_const(prop_info->type)); + Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } } @@ -38372,10 +38360,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization (%s)", + "%s::$%s accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset), - zend_get_type_by_const(prop_info->type)); + Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } } @@ -44927,10 +44914,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization (%s)", + "%s::$%s accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset), - zend_get_type_by_const(prop_info->type)); + Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } } @@ -48652,10 +48638,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization (%s)", + "%s::$%s accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset), - zend_get_type_by_const(prop_info->type)); + Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } } From 9303e6d3be456fcfc6acf7dda10cfcd9454f3f63 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 6 Mar 2016 18:40:04 +0000 Subject: [PATCH 007/369] fixed todo --- Zend/zend_API.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index a629a5e33716..fa76883c7083 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3677,7 +3677,6 @@ ZEND_API int zend_declare_typed_property_ex(zend_class_entry *ce, zend_string *n property_info->doc_comment = doc_comment; property_info->ce = ce; property_info->type = optional_type; - /* TODO(krakjoe) this may leak, introduce dtor? */ property_info->type_name = optional_type_name ? zend_new_interned_string(optional_type_name) : NULL; From b3e15cac34a6f925d27cb3bf22236f3c1455fcb5 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 6 Mar 2016 18:42:17 +0000 Subject: [PATCH 008/369] set flags correctly, remove todo --- Zend/zend_API.c | 4 +++- Zend/zend_vm_def.h | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index fa76883c7083..cd542a6ffc67 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3682,7 +3682,9 @@ ZEND_API int zend_declare_typed_property_ex(zend_class_entry *ce, zend_string *n zend_hash_update_ptr(&ce->properties_info, name, property_info); - ce->ce_flags |= ZEND_ACC_HAS_TYPE_HINTS; + if (property_info->type) { + ce->ce_flags |= ZEND_ACC_HAS_TYPE_HINTS; + } return SUCCESS; } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 8528008f64b8..381736faa960 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1859,7 +1859,6 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): } } while (0); - /* TODO(krakjoe) ce flags ? */ if (OP2_TYPE == IS_CONST && UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { From 3dfb8c21c59d4260986b01d65dd38658aa09f138 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 6 Mar 2016 18:43:28 +0000 Subject: [PATCH 009/369] unused var --- Zend/tests/type_declarations/typed_properties_004.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/tests/type_declarations/typed_properties_004.phpt b/Zend/tests/type_declarations/typed_properties_004.phpt index 668b518d82ae..46780660c04e 100644 --- a/Zend/tests/type_declarations/typed_properties_004.phpt +++ b/Zend/tests/type_declarations/typed_properties_004.phpt @@ -2,7 +2,7 @@ Test typed properties error condition (type mismatch) --FILE-- Date: Sun, 6 Mar 2016 18:49:25 +0000 Subject: [PATCH 010/369] another test --- .../typed_properties_005.phpt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_005.phpt 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 000000000000..1b2d7f4849f6 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_005.phpt @@ -0,0 +1,20 @@ +--TEST-- +Test typed properties error condition (type mismatch object) +--FILE-- +std = $dummy; + } +}; +?> +--EXPECTF-- +Fatal error: Uncaught TypeError: class@anonymous::$std must be an instance of stdClass in %s:8 +Stack trace: +#0 %s(4): class@anonymous->__construct(Object(Dummy)) +#1 {main} + thrown in %s on line 8 From 37e169cda66ee1741f8a78e9216065d666d533a9 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 6 Mar 2016 19:10:01 +0000 Subject: [PATCH 011/369] rename function so it makes sense --- Zend/zend_API.c | 4 ++-- Zend/zend_API.h | 4 +++- Zend/zend_compile.c | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index cd542a6ffc67..96ca7edf0ddd 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3606,7 +3606,7 @@ ZEND_API const char *zend_get_module_version(const char *module_name) /* {{{ */ } /* }}} */ -ZEND_API int zend_declare_typed_property_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment, zend_uchar optional_type, zend_string *optional_type_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_uchar optional_type, zend_string *optional_type_name) /* {{{ */ { zend_property_info *property_info, *property_info_ptr; @@ -3692,7 +3692,7 @@ ZEND_API int zend_declare_typed_property_ex(zend_class_entry *ce, zend_string *n 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_ex(ce, name, property, access_type, doc_comment, 0, NULL); + return zend_declare_typed_property(ce, name, property, access_type, doc_comment, 0, NULL); } /* }}} */ diff --git a/Zend/zend_API.h b/Zend/zend_API.h index e4fe6e4f13cf..b25ef861cf20 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -314,7 +314,9 @@ ZEND_API zend_bool zend_is_callable(zval *callable, uint check_flags, zend_strin 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_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment, zend_uchar type, zend_string *type_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_uchar type, zend_string *type_name); + 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); diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index b27896e7ba15..cbda5c1937f8 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5379,7 +5379,7 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ name = zend_new_interned_string_safe(name); if (optional_type) { - zend_declare_typed_property_ex(ce, name, &value_zv, flags, doc_comment, optional_type, optional_type_name); + zend_declare_typed_property(ce, name, &value_zv, flags, doc_comment, optional_type, optional_type_name); } else zend_declare_property_ex(ce, name, &value_zv, flags, doc_comment); } } From 149cb01a6924f510da033301c33639f820ea44ba Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 06:45:19 +0000 Subject: [PATCH 012/369] use flags here --- Zend/zend_vm_def.h | 3 ++- Zend/zend_vm_execute.h | 42 ++++++++++++++++++------------------------ 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 381736faa960..4bd002e1706d 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1899,7 +1899,8 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT) { + if (Z_TYPE_P(container) == IS_OBJECT && + (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6a89f40566a0..ca1d504015a6 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5606,7 +5606,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H } } while (0); - /* TODO(krakjoe) ce flags ? */ if (IS_CONST == IS_CONST && UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { @@ -9372,7 +9371,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND } } while (0); - /* TODO(krakjoe) ce flags ? */ if (IS_CV == IS_CONST && UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { @@ -11190,7 +11188,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ } } while (0); - /* TODO(krakjoe) ce flags ? */ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { @@ -13121,7 +13118,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN } } while (0); - /* TODO(krakjoe) ce flags ? */ if (IS_CONST == IS_CONST && UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { @@ -14363,7 +14359,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE } } while (0); - /* TODO(krakjoe) ce flags ? */ if (IS_CV == IS_CONST && UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { @@ -14906,7 +14901,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA } } while (0); - /* TODO(krakjoe) ce flags ? */ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { @@ -17611,7 +17605,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN } } while (0); - /* TODO(krakjoe) ce flags ? */ if (IS_CONST == IS_CONST && UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { @@ -17652,7 +17645,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT) { + if (Z_TYPE_P(container) == IS_OBJECT && + (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -22154,7 +22148,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE } } while (0); - /* TODO(krakjoe) ce flags ? */ if (IS_CV == IS_CONST && UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { @@ -22195,7 +22188,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT) { + if (Z_TYPE_P(container) == IS_OBJECT && + (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -24892,7 +24886,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA } } while (0); - /* TODO(krakjoe) ce flags ? */ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { @@ -24933,7 +24926,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT) { + if (Z_TYPE_P(container) == IS_OBJECT && + (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -27415,7 +27409,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ } } while (0); - /* TODO(krakjoe) ce flags ? */ if (IS_CONST == IS_CONST && UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { @@ -27456,7 +27449,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT) { + if (Z_TYPE_P(container) == IS_OBJECT && + (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -30906,7 +30900,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN } } while (0); - /* TODO(krakjoe) ce flags ? */ if (IS_CV == IS_CONST && UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { @@ -30947,7 +30940,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT) { + if (Z_TYPE_P(container) == IS_OBJECT && + (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -33339,7 +33333,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR } } while (0); - /* TODO(krakjoe) ce flags ? */ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { @@ -33380,7 +33373,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT) { + if (Z_TYPE_P(container) == IS_OBJECT && + (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -38350,7 +38344,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND } } while (0); - /* TODO(krakjoe) ce flags ? */ if (IS_CONST == IS_CONST && UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { @@ -38391,7 +38384,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT) { + if (Z_TYPE_P(container) == IS_OBJECT && + (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -44904,7 +44898,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER } } while (0); - /* TODO(krakjoe) ce flags ? */ if (IS_CV == IS_CONST && UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { @@ -44945,7 +44938,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT) { + if (Z_TYPE_P(container) == IS_OBJECT && + (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -48628,7 +48622,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN } } while (0); - /* TODO(krakjoe) ce flags ? */ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { @@ -48669,7 +48662,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT) { + if (Z_TYPE_P(container) == IS_OBJECT && + (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { From 52b184ed8a9c3c48dfec9e73ee890976c3846693 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 06:54:08 +0000 Subject: [PATCH 013/369] unexpected --- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 4bd002e1706d..d0c1baa149ba 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1900,7 +1900,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT && - (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index ca1d504015a6..1946bedd0b20 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17646,7 +17646,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT && - (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -22189,7 +22189,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT && - (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -24927,7 +24927,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT && - (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -27450,7 +27450,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT && - (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -30941,7 +30941,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT && - (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -33374,7 +33374,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT && - (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -38385,7 +38385,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT && - (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -44939,7 +44939,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT && - (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -48663,7 +48663,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN /* TODO(krakjoe) deref container ? */ if (Z_TYPE_P(container) == IS_OBJECT && - (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { From bd4368c2f3667ec76fc0eeadcf6613fdcba7672f Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 06:59:36 +0000 Subject: [PATCH 014/369] more words in error message --- .../typed_properties_004.phpt | 2 +- .../typed_properties_005.phpt | 2 +- Zend/zend_vm_def.h | 23 +- Zend/zend_vm_execute.h | 504 +++++++++++++----- 4 files changed, 374 insertions(+), 157 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_004.phpt b/Zend/tests/type_declarations/typed_properties_004.phpt index 46780660c04e..b56f77319444 100644 --- a/Zend/tests/type_declarations/typed_properties_004.phpt +++ b/Zend/tests/type_declarations/typed_properties_004.phpt @@ -11,7 +11,7 @@ new class("PHP 7 is better than you, and it knows it ...") { }; ?> --EXPECTF-- -Fatal error: Uncaught TypeError: class@anonymous::$int must be integer in %s:6 +Fatal error: Uncaught TypeError: class@anonymous::$int must be integer, string used in %s:6 Stack trace: #0 %s(2): class@anonymous->__construct('PHP 7 is better...') #1 {main} diff --git a/Zend/tests/type_declarations/typed_properties_005.phpt b/Zend/tests/type_declarations/typed_properties_005.phpt index 1b2d7f4849f6..21932471d757 100644 --- a/Zend/tests/type_declarations/typed_properties_005.phpt +++ b/Zend/tests/type_declarations/typed_properties_005.phpt @@ -13,7 +13,7 @@ new class(new Dummy) { }; ?> --EXPECTF-- -Fatal error: Uncaught TypeError: class@anonymous::$std must be an instance of stdClass in %s:8 +Fatal error: Uncaught TypeError: 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} diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d0c1baa149ba..b7cb592f4c44 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2306,25 +2306,26 @@ ZEND_VM_C_LABEL(fast_assign_obj): /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", - ZSTR_VAL(prop_info->ce->name), + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", - ZSTR_VAL(prop_info->ce->name), + "%s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 1946bedd0b20..9c8fabf9cbc5 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17940,20 +17940,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -18149,20 +18155,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -18358,20 +18370,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -18567,20 +18585,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -22483,20 +22507,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -22692,20 +22722,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -22901,20 +22937,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -23110,20 +23152,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -25221,20 +25269,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -25430,20 +25484,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -25639,20 +25699,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -25848,20 +25914,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -27816,20 +27888,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -28025,20 +28103,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -28234,20 +28318,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -28443,20 +28533,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -31307,20 +31403,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -31516,20 +31618,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -31725,20 +31833,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -31934,20 +32048,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -33741,20 +33861,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -33950,20 +34076,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -34159,20 +34291,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -34368,20 +34506,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -38795,20 +38939,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -39004,20 +39154,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -39213,20 +39369,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -39422,20 +39584,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -45305,20 +45473,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -45514,20 +45688,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -45723,20 +45903,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -45932,20 +46118,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -49030,20 +49222,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -49239,20 +49437,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -49448,20 +49652,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -49657,20 +49867,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s", + "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name)); + ZSTR_VAL(prop_info->type_name), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type)); + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } From 0f265a3ae1e1de32248e2e8c49a0d14a3123cc46 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 07:36:01 +0000 Subject: [PATCH 015/369] inheritance checks --- .../typed_properties_006.phpt | 15 ++ .../typed_properties_007.phpt | 19 ++ Zend/zend_inheritance.c | 23 +++ Zend/zend_vm_execute.h | 180 ------------------ 4 files changed, 57 insertions(+), 180 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_006.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_007.phpt 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 000000000000..2e775395c43e --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_006.phpt @@ -0,0 +1,15 @@ +--TEST-- +Test typed properties inheritance (scalar) +--FILE-- + +--EXPECTF-- +Fatal error: Type of Bar::$qux must be integer (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 000000000000..a0cd72268d11 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_007.phpt @@ -0,0 +1,19 @@ +--TEST-- +Test typed properties inheritance +--FILE-- + +--EXPECTF-- +Fatal error: Type of Bar::$qux must be Whatever (as in class Foo) in %s on line 11 + + diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 8952661d8a13..c6f1bd09eb0b 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -625,6 +625,29 @@ 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->type)) { + + /* TODO(krakjoe) comparing strings feels wrong */ + if (parent_info->type == IS_OBJECT) { + if (child_info->type != IS_OBJECT || + !zend_string_equals_ci(parent_info->type_name, child_info->type_name)) { + zend_error_noreturn(E_COMPILE_ERROR, + "Type of %s::$%s must be %s (as in class %s)", + ZSTR_VAL(ce->name), + ZSTR_VAL(key), + ZSTR_VAL(parent_info->type_name), + ZSTR_VAL(ce->parent->name)); + } + } else if (parent_info->type != child_info->type) { + zend_error_noreturn(E_COMPILE_ERROR, + "Type of %s::$%s must be %s (as in class %s)", + ZSTR_VAL(ce->name), + ZSTR_VAL(key), + zend_get_type_by_const(parent_info->type), + ZSTR_VAL(ce->parent->name)); + } + } + if (UNEXPECTED(parent_info->flags & (ZEND_ACC_PRIVATE|ZEND_ACC_SHADOW))) { child_info->flags |= ZEND_ACC_CHANGED; } else { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 9c8fabf9cbc5..7a6bc94b3eb0 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17935,10 +17935,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -17950,8 +17947,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -18150,10 +18145,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -18165,8 +18157,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -18365,10 +18355,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -18380,8 +18367,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -18580,10 +18565,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -18595,8 +18577,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -22502,10 +22482,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -22517,8 +22494,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -22717,10 +22692,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -22732,8 +22704,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -22932,10 +22902,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -22947,8 +22914,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -23147,10 +23112,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -23162,8 +23124,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -25264,10 +25224,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -25279,8 +25236,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -25479,10 +25434,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -25494,8 +25446,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -25694,10 +25644,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -25709,8 +25656,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -25909,10 +25854,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -25924,8 +25866,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -27883,10 +27823,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -27898,8 +27835,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -28098,10 +28033,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -28113,8 +28045,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -28313,10 +28243,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -28328,8 +28255,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -28528,10 +28453,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -28543,8 +28465,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -31398,10 +31318,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -31413,8 +31330,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -31613,10 +31528,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -31628,8 +31540,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -31828,10 +31738,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -31843,8 +31750,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -32043,10 +31948,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -32058,8 +31960,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -33856,10 +33756,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -33871,8 +33768,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -34071,10 +33966,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -34086,8 +33978,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -34286,10 +34176,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -34301,8 +34188,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -34501,10 +34386,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -34516,8 +34398,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -38934,10 +38814,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -38949,8 +38826,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -39149,10 +39024,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -39164,8 +39036,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -39364,10 +39234,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -39379,8 +39246,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -39579,10 +39444,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -39594,8 +39456,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -45468,10 +45328,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -45483,8 +45340,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -45683,10 +45538,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -45698,8 +45550,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -45898,10 +45748,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -45913,8 +45760,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -46113,10 +45958,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -46128,8 +45970,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -49217,10 +49057,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -49232,8 +49069,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -49432,10 +49267,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -49447,8 +49279,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -49647,10 +49477,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -49662,8 +49489,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -49862,10 +49687,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D /* TODO(krakjoe) needs a cache slot */ zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - /* TODO(krakjoe) check instanceof is sound */ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), @@ -49877,8 +49699,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - - /* TODO(krakjoe) check wording of error message */ zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), From 027f0a1e2bb6c39414b7ab8db913b7a8346d25a9 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 07:40:15 +0000 Subject: [PATCH 016/369] a todo --- Zend/zend_inheritance.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index c6f1bd09eb0b..bebc27edc7be 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -628,6 +628,7 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke if (UNEXPECTED(parent_info->type)) { /* TODO(krakjoe) comparing strings feels wrong */ + /* TODO(krakjoe) handle self, parent, static */ if (parent_info->type == IS_OBJECT) { if (child_info->type != IS_OBJECT || !zend_string_equals_ci(parent_info->type_name, child_info->type_name)) { From df9556b4a999c468b9859dfb9066ece8ac3c51bb Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 08:04:40 +0000 Subject: [PATCH 017/369] nope --- Zend/zend_inheritance.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index bebc27edc7be..3911d4532ca7 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -628,7 +628,7 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke if (UNEXPECTED(parent_info->type)) { /* TODO(krakjoe) comparing strings feels wrong */ - /* TODO(krakjoe) handle self, parent, static */ + /* TODO(krakjoe) handle self, parent */ if (parent_info->type == IS_OBJECT) { if (child_info->type != IS_OBJECT || !zend_string_equals_ci(parent_info->type_name, child_info->type_name)) { From 64bce1e77c4e3daafddf001ef01b07c31147761f Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 08:15:00 +0000 Subject: [PATCH 018/369] some more resolution stuff --- Zend/zend_inheritance.c | 30 +++++++++++++++-- Zend/zend_inheritance.h | 2 ++ Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 72 ++++++++++++++++++++--------------------- 4 files changed, 66 insertions(+), 40 deletions(-) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 3911d4532ca7..a405020dbd4b 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -618,6 +618,29 @@ static zend_function *do_inherit_method(zend_string *key, zend_function *parent, } /* }}} */ +zend_string* zend_resolve_property_type(zend_property_info *info) /* {{{ */ +{ + zend_string *type = info->type_name; + + if (!type) { + return NULL; + } + + if (zend_string_equals_literal_ci(type, "parent")) { + if (info && info->ce && info->ce->parent) { + return info->ce->parent->name; + } + } + + if (zend_string_equals_literal_ci(type, "self")) { + if (info && info->ce) { + return info->ce->name; + } + } + + return type; +} /* }}} */ + static void do_inherit_property(zend_property_info *parent_info, zend_string *key, zend_class_entry *ce) /* {{{ */ { zval *child = zend_hash_find(&ce->properties_info, key); @@ -631,12 +654,13 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke /* TODO(krakjoe) handle self, parent */ if (parent_info->type == IS_OBJECT) { if (child_info->type != IS_OBJECT || - !zend_string_equals_ci(parent_info->type_name, child_info->type_name)) { + !zend_string_equals_ci(zend_resolve_property_type(parent_info), + zend_resolve_property_type(child_info))) { zend_error_noreturn(E_COMPILE_ERROR, "Type of %s::$%s must be %s (as in class %s)", ZSTR_VAL(ce->name), ZSTR_VAL(key), - ZSTR_VAL(parent_info->type_name), + ZSTR_VAL(zend_resolve_property_type(parent_info)), ZSTR_VAL(ce->parent->name)); } } else if (parent_info->type != child_info->type) { @@ -648,7 +672,7 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke ZSTR_VAL(ce->parent->name)); } } - + if (UNEXPECTED(parent_info->flags & (ZEND_ACC_PRIVATE|ZEND_ACC_SHADOW))) { child_info->flags |= ZEND_ACC_CHANGED; } else { diff --git a/Zend/zend_inheritance.h b/Zend/zend_inheritance.h index bbe43b0ccda8..37a912fc2ac4 100644 --- a/Zend/zend_inheritance.h +++ b/Zend/zend_inheritance.h @@ -35,6 +35,8 @@ void zend_do_early_binding(void); void zend_check_deprecated_constructor(const zend_class_entry *ce); +ZEND_API zend_string* zend_resolve_property_type(zend_property_info *info); + END_EXTERN_C() #endif diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b7cb592f4c44..4350e952e6ac 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2311,7 +2311,7 @@ ZEND_VM_C_LABEL(fast_assign_obj): "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 7a6bc94b3eb0..ffea52049daf 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17940,7 +17940,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -18150,7 +18150,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -18360,7 +18360,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -18570,7 +18570,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -22487,7 +22487,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -22697,7 +22697,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -22907,7 +22907,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -23117,7 +23117,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -25229,7 +25229,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -25439,7 +25439,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -25649,7 +25649,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -25859,7 +25859,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -27828,7 +27828,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -28038,7 +28038,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -28248,7 +28248,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -28458,7 +28458,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -31323,7 +31323,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -31533,7 +31533,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -31743,7 +31743,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -31953,7 +31953,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -33761,7 +33761,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -33971,7 +33971,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -34181,7 +34181,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -34391,7 +34391,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -38819,7 +38819,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -39029,7 +39029,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -39239,7 +39239,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -39449,7 +39449,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -45333,7 +45333,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -45543,7 +45543,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -45753,7 +45753,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -45963,7 +45963,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -49062,7 +49062,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -49272,7 +49272,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -49482,7 +49482,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -49692,7 +49692,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D "%s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(prop_info->type_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); From 3f56cd9f59532c77feb87c5446d58493ad71f499 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 09:11:48 +0000 Subject: [PATCH 019/369] more inheritance stuff --- .../typed_properties_008.phpt | 16 ++++++++++++++++ Zend/zend_inheritance.c | 19 ++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_008.phpt 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 000000000000..0efff906fa83 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_008.phpt @@ -0,0 +1,16 @@ +--TEST-- +Test typed properties inheritance (missing info) +--FILE-- + +--EXPECTF-- +Fatal error: Type of Bar::$qux must be integer (as in class Foo) in %s on line 8 + + diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index a405020dbd4b..98ead9a2aed2 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -651,7 +651,6 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke if (UNEXPECTED(parent_info->type)) { /* TODO(krakjoe) comparing strings feels wrong */ - /* TODO(krakjoe) handle self, parent */ if (parent_info->type == IS_OBJECT) { if (child_info->type != IS_OBJECT || !zend_string_equals_ci(zend_resolve_property_type(parent_info), @@ -699,6 +698,24 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke } } } else { + if (UNEXPECTED(parent_info->type)) { + if (parent_info->type == IS_OBJECT) { + zend_error_noreturn(E_COMPILE_ERROR, + "Type of %s::$%s must be %s (as in class %s)", + ZSTR_VAL(ce->name), + ZSTR_VAL(key), + ZSTR_VAL(zend_resolve_property_type(parent_info)), + ZSTR_VAL(ce->parent->name)); + } else { + zend_error_noreturn(E_COMPILE_ERROR, + "Type of %s::$%s must be %s (as in class %s)", + ZSTR_VAL(ce->name), + ZSTR_VAL(key), + zend_get_type_by_const(parent_info->type), + ZSTR_VAL(ce->parent->name)); + } + } + if (UNEXPECTED(parent_info->flags & (ZEND_ACC_PRIVATE|ZEND_ACC_SHADOW))) { if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) { child_info = zend_duplicate_property_info_internal(parent_info); From 95eed91aeab7637d524d8ee2bc5f44ca3dded3ea Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 09:22:49 +0000 Subject: [PATCH 020/369] fix ast pretty printer --- Zend/zend_ast.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 6540f82c6b3c..92a1ba2e78d9 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -1439,6 +1439,8 @@ static void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int case ZEND_AST_PROP_ELEM: smart_str_appendc(str, '$'); /* break missing intentionally */ + zend_ast_export_name(str, ast->child[1], 0, indent); + APPEND_DEFAULT_VALUE(2); case ZEND_AST_CONST_ELEM: zend_ast_export_name(str, ast->child[0], 0, indent); APPEND_DEFAULT_VALUE(1); From ab3e992dfdceb52f42b57780ff43300e25ed5ac4 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 09:42:52 +0000 Subject: [PATCH 021/369] refactor a little --- Zend/zend_vm_def.h | 71 +- Zend/zend_vm_execute.h | 2052 ++++++++++++++++++++-------------------- 2 files changed, 1080 insertions(+), 1043 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 4350e952e6ac..fe311dcaadb1 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1859,19 +1859,19 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): } } while (0); - if (OP2_TYPE == IS_CONST && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - - /* TODO(krakjoe) needs cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } } } @@ -2296,37 +2296,38 @@ ZEND_VM_C_LABEL(fast_assign_obj): ZVAL_DEREF(value); } - if (OP2_TYPE == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index ffea52049daf..a6677e0cd7e7 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5606,19 +5606,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H } } while (0); - if (IS_CONST == IS_CONST && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - - /* TODO(krakjoe) needs cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } } } @@ -9371,19 +9371,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND } } while (0); - if (IS_CV == IS_CONST && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - - /* TODO(krakjoe) needs cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } } } @@ -11188,19 +11188,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ } } while (0); - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - - /* TODO(krakjoe) needs cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } } } @@ -13118,19 +13118,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN } } while (0); - if (IS_CONST == IS_CONST && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - - /* TODO(krakjoe) needs cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } } } @@ -14359,19 +14359,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE } } while (0); - if (IS_CV == IS_CONST && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - - /* TODO(krakjoe) needs cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } } } @@ -14901,19 +14901,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA } } while (0); - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - - /* TODO(krakjoe) needs cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } } } @@ -17605,19 +17605,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN } } while (0); - if (IS_CONST == IS_CONST && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - - /* TODO(krakjoe) needs cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } } } @@ -17925,37 +17925,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - if (IS_CONST == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -18135,37 +18136,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - if (IS_CONST == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -18345,37 +18347,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - if (IS_CONST == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -18555,37 +18558,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - if (IS_CONST == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -22152,19 +22156,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE } } while (0); - if (IS_CV == IS_CONST && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - - /* TODO(krakjoe) needs cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } } } @@ -22472,37 +22476,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - if (IS_CV == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -22682,37 +22687,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - if (IS_CV == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -22892,37 +22898,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - if (IS_CV == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -23102,37 +23109,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - if (IS_CV == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -24894,19 +24902,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA } } while (0); - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - - /* TODO(krakjoe) needs cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } } } @@ -25214,37 +25222,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -25424,37 +25433,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -25634,37 +25644,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -25844,37 +25855,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -27421,19 +27433,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ } } while (0); - if (IS_CONST == IS_CONST && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - - /* TODO(krakjoe) needs cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } } } @@ -27813,37 +27825,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - if (IS_CONST == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -28023,37 +28036,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - if (IS_CONST == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -28233,37 +28247,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - if (IS_CONST == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -28443,37 +28458,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - if (IS_CONST == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -30916,19 +30932,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN } } while (0); - if (IS_CV == IS_CONST && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - - /* TODO(krakjoe) needs cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } } } @@ -31308,37 +31324,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - if (IS_CV == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -31518,37 +31535,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - if (IS_CV == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -31728,37 +31746,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - if (IS_CV == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -31938,37 +31957,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - if (IS_CV == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -33353,19 +33373,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR } } while (0); - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - - /* TODO(krakjoe) needs cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } } } @@ -33746,37 +33766,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -33956,37 +33977,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -34166,37 +34188,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -34376,37 +34399,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -38368,19 +38392,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND } } while (0); - if (IS_CONST == IS_CONST && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - - /* TODO(krakjoe) needs cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } } } @@ -38804,37 +38828,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - if (IS_CONST == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -39014,37 +39039,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - if (IS_CONST == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -39224,37 +39250,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - if (IS_CONST == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -39434,37 +39461,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - if (IS_CONST == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -44926,19 +44954,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER } } while (0); - if (IS_CV == IS_CONST && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - - /* TODO(krakjoe) needs cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } } } @@ -45318,37 +45346,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - if (IS_CV == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -45528,37 +45557,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - if (IS_CV == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -45738,37 +45768,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - if (IS_CV == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -45948,37 +45979,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - if (IS_CV == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -48654,19 +48686,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN } } while (0); - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - - /* TODO(krakjoe) needs cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type && + Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } } } @@ -49047,37 +49079,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -49257,37 +49290,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -49467,37 +49501,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } @@ -49677,37 +49712,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - /* TODO(krakjoe) needs a cache slot */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property_name) == IS_STRING) { + /* TODO(krakjoe) needs a cache slot */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); - if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + if (prop_info && prop_info->type) { + if (prop_info->type == IS_OBJECT) { + /* TODO(krakjoe) needs a cache slot */ + zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "%s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "%s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + zend_get_type_by_const(prop_info->type), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); } } } From 48c98abf1b42a97a0e16b8ead2ce0363e9715eb7 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 09:52:19 +0000 Subject: [PATCH 022/369] add unset test --- .../typed_properties_009.phpt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_009.phpt 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 000000000000..75c3521cf651 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_009.phpt @@ -0,0 +1,18 @@ +--TEST-- +Test typed disallow unset +--FILE-- +bar); +?> +--EXPECTF-- +Fatal error: Uncaught TypeError: Foo::$bar must not be unset in %s:7 +Stack trace: +#0 {main} + thrown in %s on line 7 + + From 0b4fb46a0db60ab005263f81d0ea835bc821ebf1 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 10:34:36 +0000 Subject: [PATCH 023/369] abominable reading ahead of the unknown ... in the dark, scarily .... boo --- Zend/zend_vm_def.h | 19 ++--- Zend/zend_vm_execute.h | 171 ++++++++++++++++++++++------------------- 2 files changed, 100 insertions(+), 90 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index fe311dcaadb1..bd26f6f5e2a4 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1899,16 +1899,17 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a6677e0cd7e7..32cd8f38013f 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17645,16 +17645,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } } } @@ -22196,16 +22197,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } } } @@ -24942,16 +24944,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } } } @@ -27473,16 +27476,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } } } @@ -30972,16 +30976,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } } } @@ -33413,16 +33418,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } } } @@ -38432,16 +38438,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } } } @@ -44994,16 +45001,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } } } @@ -48726,16 +48734,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN } /* TODO(krakjoe) deref container ? */ - if (Z_TYPE_P(container) == IS_OBJECT && - UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } } } From 4d496efb523ff3d15fb292c1b530b71f4b0184b3 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 11:03:36 +0000 Subject: [PATCH 024/369] some mo tests --- .../typed_properties_010.phpt | 22 + .../typed_properties_011.phpt | 19 + .../typed_properties_012.phpt | 18 + Zend/zend_vm_def.h | 47 +- Zend/zend_vm_execute.h | 473 ++++++++++++++---- 5 files changed, 479 insertions(+), 100 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_010.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_011.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_012.phpt 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 000000000000..8506792f37e6 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_010.phpt @@ -0,0 +1,22 @@ +--TEST-- +Test typed disallow fetch reference for func arg +--FILE-- +bar); +?> +--EXPECTF-- +Fatal error: Uncaught TypeError: fetching reference to Foo::$bar is disallowed in %s:11 +Stack trace: +#0 {main} + thrown in %s on line 11 + + 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 000000000000..ed9db44c6943 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_011.phpt @@ -0,0 +1,19 @@ +--TEST-- +Test typed disallow fetch reference for init array +--FILE-- +bar]; +?> +--EXPECTF-- +Fatal error: Uncaught TypeError: fetching reference to Foo::$bar is disallowed in %s:8 +Stack trace: +#0 {main} + thrown in %s on line 8 + + 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 000000000000..47122ab762eb --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_012.phpt @@ -0,0 +1,18 @@ +--TEST-- +Test typed disallow fetch reference for foreach +--FILE-- + +--EXPECTF-- +Fatal error: Uncaught TypeError: foreach by reference over Foo is disallowed in %s:7 +Stack trace: +#0 {main} + thrown in %s on line 7 + + diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index bd26f6f5e2a4..75b6ed790720 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1898,17 +1898,21 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; } } } @@ -2045,6 +2049,21 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST FREE_OP1_VAR_PTR(); HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -6115,6 +6134,14 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) FREE_OP1_VAR_PTR(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { + if (Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) { + zend_throw_exception_ex( + zend_ce_type_error, 0, + "foreach by reference over %s is disallowed", + ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + HANDLE_EXCEPTION(); + } + if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) { if (array_ptr == array_ref) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 32cd8f38013f..e12ad5b09609 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4263,6 +4263,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { + if (Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) { + zend_throw_exception_ex( + zend_ce_type_error, 0, + "foreach by reference over %s is disallowed", + ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + HANDLE_EXCEPTION(); + } + if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (IS_CONST == IS_VAR || IS_CONST == IS_CV) { if (array_ptr == array_ref) { @@ -5725,6 +5733,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -9490,6 +9513,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -11308,6 +11346,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -12621,6 +12674,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_TMP_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { + if (Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) { + zend_throw_exception_ex( + zend_ce_type_error, 0, + "foreach by reference over %s is disallowed", + ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + HANDLE_EXCEPTION(); + } + if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) { if (array_ptr == array_ref) { @@ -13165,6 +13226,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -14406,6 +14482,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -14948,6 +15039,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -16163,6 +16269,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { + if (Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) { + zend_throw_exception_ex( + zend_ce_type_error, 0, + "foreach by reference over %s is disallowed", + ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + HANDLE_EXCEPTION(); + } + if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (IS_VAR == IS_VAR || IS_VAR == IS_CV) { if (array_ptr == array_ref) { @@ -17644,17 +17758,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; } } } @@ -17718,6 +17836,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -22196,17 +22329,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; } } } @@ -22270,6 +22407,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -24943,17 +25095,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; } } } @@ -25017,6 +25173,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -27475,17 +27646,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; } } } @@ -27621,6 +27796,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -30975,17 +31165,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; } } } @@ -31121,6 +31315,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -33417,17 +33626,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; } } } @@ -33564,6 +33777,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -36492,6 +36720,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { + if (Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) { + zend_throw_exception_ex( + zend_ce_type_error, 0, + "foreach by reference over %s is disallowed", + ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + HANDLE_EXCEPTION(); + } + if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (IS_CV == IS_VAR || IS_CV == IS_CV) { if (array_ptr == array_ref) { @@ -38437,17 +38673,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; } } } @@ -38583,6 +38823,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -45000,17 +45255,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; } } } @@ -45146,6 +45405,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -48733,17 +49007,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last] && (EX(opline) + 1)->opcode == ZEND_ASSIGN_REF) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; } } } @@ -48880,6 +49158,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "fetching reference to %s::$%s is disallowed", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { From 95a9e0dc921298c5bea533a072093e6e46e890e3 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 11:36:13 +0000 Subject: [PATCH 025/369] fixes and more stuff --- Zend/zend_object_handlers.c | 8 ++++++++ Zend/zend_vm_def.h | 5 +++-- Zend/zend_vm_execute.h | 18 +++++++++--------- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index c66f8ad7c3f5..457e25fa631d 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -804,6 +804,14 @@ static zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type, fprintf(stderr, "Ptr object #%d property: %s\n", Z_OBJ_HANDLE_P(object), ZSTR_VAL(name)); #endif + if (UNEXPECTED(zobj->ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + zend_property_info *prop_info = zend_hash_find_ptr(&zobj->ce->properties_info, name); + + if (prop_info && prop_info->type) { + return NULL; + } + } + property_offset = zend_get_property_offset(zobj->ce, name, (zobj->ce->__get != NULL), cache_slot); if (EXPECTED(property_offset != ZEND_WRONG_PROPERTY_OFFSET)) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 75b6ed790720..7a056230e094 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1898,7 +1898,8 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + /* TODO(krakjoe) deref container ? */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { case ZEND_ASSIGN_REF: @@ -1912,7 +1913,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } - } break; + } break; } } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index e12ad5b09609..13e20f5a9e5d 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17758,7 +17758,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { case ZEND_ASSIGN_REF: @@ -22329,7 +22329,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { case ZEND_ASSIGN_REF: @@ -25095,7 +25095,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { case ZEND_ASSIGN_REF: @@ -27646,7 +27646,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { case ZEND_ASSIGN_REF: @@ -31165,7 +31165,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { case ZEND_ASSIGN_REF: @@ -33626,7 +33626,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { case ZEND_ASSIGN_REF: @@ -38673,7 +38673,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { case ZEND_ASSIGN_REF: @@ -45255,7 +45255,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { case ZEND_ASSIGN_REF: @@ -49007,7 +49007,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { case ZEND_ASSIGN_REF: From 49ea1df4c4e0c53f4ab10aeda88ef4508db40cce Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 13:47:12 +0000 Subject: [PATCH 026/369] woops --- Zend/zend_ast.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 92a1ba2e78d9..64df7e95f862 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -1437,8 +1437,8 @@ static void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int } break; case ZEND_AST_PROP_ELEM: + /* TODO(krakjoe) export type */ smart_str_appendc(str, '$'); - /* break missing intentionally */ zend_ast_export_name(str, ast->child[1], 0, indent); APPEND_DEFAULT_VALUE(2); case ZEND_AST_CONST_ELEM: From b557f8ba8e6cd30131e68a2cbbcce9a8cd959448 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 13:56:55 +0000 Subject: [PATCH 027/369] don't check private property types during inheritance --- Zend/zend_inheritance.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 98ead9a2aed2..0a8c339cd403 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -648,7 +648,7 @@ 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->type)) { + if (UNEXPECTED(parent_info->type && !(parent_info->flags & ZEND_ACC_PRIVATE))) { /* TODO(krakjoe) comparing strings feels wrong */ if (parent_info->type == IS_OBJECT) { From c957e752fd76df95a0002d11dbf1073ebbebfa96 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 14:16:06 +0000 Subject: [PATCH 028/369] check type on declaration --- Zend/zend_API.c | 49 +++++++++++++++++++++++++++++++++++++++++++++ Zend/zend_compile.c | 2 +- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 96ca7edf0ddd..f70b1a736da1 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3622,6 +3622,55 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name } } + if (optional_type) { + /* TODO(krakjoe) not sure about exceptions in [no active file] */ + if (optional_type == IS_OBJECT) { + if (Z_TYPE_P(property) != IS_UNDEF) { + zend_string *type_name = optional_type_name; + + if (zend_string_equals_literal_ci(type_name, "parent")) { + if (!ce->parent) { + zend_throw_exception_ex(zend_ce_type_error, optional_type, + "Type of %s::$%s cannot be parent type, no parent scope active", + ZSTR_VAL(ce->name), + ZSTR_VAL(name)); + return FAILURE; + } + + type_name = ce->parent->name; + } + + if (zend_string_equals_literal_ci(type_name, "self")) { + type_name = ce->name; + } + + zend_throw_exception_ex(zend_ce_type_error, optional_type, + "Type of %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(ce->name), + ZSTR_VAL(name), + ZSTR_VAL(type_name), + Z_TYPE_P(property) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(property)->name) : + zend_get_type_by_const(Z_TYPE_P(property))); + return FAILURE; + } + } else if (!ZEND_SAME_FAKE_TYPE(optional_type, Z_TYPE_P(property))) { + zend_throw_exception_ex(zend_ce_type_error, optional_type, + "Type of %s::$%s must be %s, %s used", + ZSTR_VAL(ce->name), + ZSTR_VAL(name), + zend_get_type_by_const(optional_type), + Z_TYPE_P(property) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(property)->name) : + zend_get_type_by_const(Z_TYPE_P(property))); + return FAILURE; + } + } + + if (Z_TYPE_P(property) == IS_UNDEF) { + ZVAL_NULL(property); + } + if (!(access_type & ZEND_ACC_PPP_MASK)) { access_type |= ZEND_ACC_PUBLIC; } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index cbda5c1937f8..61faf20fccc5 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5374,7 +5374,7 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ if (value_ast) { zend_const_expr_to_zval(&value_zv, value_ast); } else { - ZVAL_NULL(&value_zv); + ZVAL_UNDEF(&value_zv); } name = zend_new_interned_string_safe(name); From c156399618a0137aec1e2049e62ac9fe8e0962fc Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 14:27:29 +0000 Subject: [PATCH 029/369] more tests, check initial value types --- .../type_declarations/typed_properties_013.phpt | 13 +++++++++++++ .../type_declarations/typed_properties_014.phpt | 13 +++++++++++++ .../type_declarations/typed_properties_015.phpt | 13 +++++++++++++ .../type_declarations/typed_properties_016.phpt | 17 +++++++++++++++++ Zend/zend_API.c | 12 ++++++------ 5 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_013.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_014.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_015.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_016.phpt 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 000000000000..1bf8a6289ba6 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_013.phpt @@ -0,0 +1,13 @@ +--TEST-- +Test typed disallow incorrect type initial value (scalar) +--FILE-- + +--EXPECTF-- +Fatal error: Type of Foo::$bar must be integer, float used 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 000000000000..c9fb16304038 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_014.phpt @@ -0,0 +1,13 @@ +--TEST-- +Test typed disallow incorrect type initial value (array) +--FILE-- + +--EXPECTF-- +Fatal error: Type of Foo::$bar must be array, null used 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 000000000000..3a1fb8f12af3 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_015.phpt @@ -0,0 +1,13 @@ +--TEST-- +Test typed disallow incorrect type initial value (object) +--FILE-- + +--EXPECTF-- +Fatal error: Type of Foo::$bar must be stdClass, null used in %s on line 3 + + + 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 000000000000..5938af1f8829 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_016.phpt @@ -0,0 +1,17 @@ +--TEST-- +Test typed initial values +--FILE-- + +--EXPECT-- +ok + + + diff --git a/Zend/zend_API.c b/Zend/zend_API.c index f70b1a736da1..66d9cabfb962 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3630,7 +3630,7 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name if (zend_string_equals_literal_ci(type_name, "parent")) { if (!ce->parent) { - zend_throw_exception_ex(zend_ce_type_error, optional_type, + zend_error(E_COMPILE_ERROR, "Type of %s::$%s cannot be parent type, no parent scope active", ZSTR_VAL(ce->name), ZSTR_VAL(name)); @@ -3644,18 +3644,18 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name type_name = ce->name; } - zend_throw_exception_ex(zend_ce_type_error, optional_type, - "Type of %s::$%s must be an instance of %s, %s used", + zend_error(E_COMPILE_ERROR, + "Type of %s::$%s must be %s, %s used", ZSTR_VAL(ce->name), ZSTR_VAL(name), ZSTR_VAL(type_name), Z_TYPE_P(property) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(property)->name) : zend_get_type_by_const(Z_TYPE_P(property))); - return FAILURE; + return FAILURE; } - } else if (!ZEND_SAME_FAKE_TYPE(optional_type, Z_TYPE_P(property))) { - zend_throw_exception_ex(zend_ce_type_error, optional_type, + } else if (Z_TYPE_P(property) != IS_UNDEF && !ZEND_SAME_FAKE_TYPE(optional_type, Z_TYPE_P(property))) { + zend_error(E_COMPILE_ERROR, "Type of %s::$%s must be %s, %s used", ZSTR_VAL(ce->name), ZSTR_VAL(name), From 861287a33db4c737f0833a81797dcac781b1b011 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 14:29:26 +0000 Subject: [PATCH 030/369] remove todo --- Zend/zend_API.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 66d9cabfb962..5350abaeaa08 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3623,7 +3623,6 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name } if (optional_type) { - /* TODO(krakjoe) not sure about exceptions in [no active file] */ if (optional_type == IS_OBJECT) { if (Z_TYPE_P(property) != IS_UNDEF) { zend_string *type_name = optional_type_name; From f7f8c1b62397c3206a82e302ddd26ebc995e5155 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 7 Mar 2016 16:11:40 +0000 Subject: [PATCH 031/369] @TazeTSchnitzel rescued me from hell ... --- Zend/zend_compile.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 61faf20fccc5..bc71fd21ce44 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5380,7 +5380,9 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ name = zend_new_interned_string_safe(name); if (optional_type) { zend_declare_typed_property(ce, name, &value_zv, flags, doc_comment, optional_type, optional_type_name); - } else zend_declare_property_ex(ce, name, &value_zv, flags, doc_comment); + } else { + zend_declare_property_ex(ce, name, &value_zv, flags, doc_comment); + } } } /* }}} */ From ce473721d5fa5b91c83319a14ca7e99242b29ffe Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 8 Mar 2016 07:56:29 +0000 Subject: [PATCH 032/369] better error messages --- .../typed_properties_002.phpt | 2 +- .../typed_properties_003.phpt | 2 +- .../typed_properties_004.phpt | 2 +- .../typed_properties_005.phpt | 2 +- .../typed_properties_009.phpt | 2 +- .../typed_properties_010.phpt | 2 +- .../typed_properties_011.phpt | 2 +- .../typed_properties_012.phpt | 2 +- .../typed_properties_013.phpt | 2 +- .../typed_properties_014.phpt | 2 +- .../typed_properties_015.phpt | 2 +- Zend/zend_API.c | 46 +-- Zend/zend_vm_def.h | 16 +- Zend/zend_vm_execute.h | 275 +++++++++--------- 14 files changed, 176 insertions(+), 183 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_002.phpt b/Zend/tests/type_declarations/typed_properties_002.phpt index a046d792ca8a..facaee077e0b 100644 --- a/Zend/tests/type_declarations/typed_properties_002.phpt +++ b/Zend/tests/type_declarations/typed_properties_002.phpt @@ -9,7 +9,7 @@ $thing = new class() { var_dump($thing->int); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: class@anonymous::$int accessed before initialization in %s:6 +Fatal error: Uncaught TypeError: 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 index b2743a9adcee..36337b3066af 100644 --- a/Zend/tests/type_declarations/typed_properties_003.phpt +++ b/Zend/tests/type_declarations/typed_properties_003.phpt @@ -9,7 +9,7 @@ $thing = new class() { $var = &$thing->int; ?> --EXPECTF-- -Fatal error: Uncaught TypeError: fetching reference to class@anonymous::$int is disallowed in %s:6 +Fatal error: Uncaught TypeError: Typed property class@anonymous::$int must not be referenced in %s:6 Stack trace: #0 {main} thrown in %s on line 6 diff --git a/Zend/tests/type_declarations/typed_properties_004.phpt b/Zend/tests/type_declarations/typed_properties_004.phpt index b56f77319444..59314ab8dad1 100644 --- a/Zend/tests/type_declarations/typed_properties_004.phpt +++ b/Zend/tests/type_declarations/typed_properties_004.phpt @@ -11,7 +11,7 @@ new class("PHP 7 is better than you, and it knows it ...") { }; ?> --EXPECTF-- -Fatal error: Uncaught TypeError: class@anonymous::$int must be integer, string used in %s:6 +Fatal error: Uncaught TypeError: Typed property class@anonymous::$int must be integer, string used in %s:6 Stack trace: #0 %s(2): class@anonymous->__construct('PHP 7 is better...') #1 {main} diff --git a/Zend/tests/type_declarations/typed_properties_005.phpt b/Zend/tests/type_declarations/typed_properties_005.phpt index 21932471d757..05de2251c972 100644 --- a/Zend/tests/type_declarations/typed_properties_005.phpt +++ b/Zend/tests/type_declarations/typed_properties_005.phpt @@ -13,7 +13,7 @@ new class(new Dummy) { }; ?> --EXPECTF-- -Fatal error: Uncaught TypeError: class@anonymous::$std must be an instance of stdClass, Dummy used in %s:8 +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} diff --git a/Zend/tests/type_declarations/typed_properties_009.phpt b/Zend/tests/type_declarations/typed_properties_009.phpt index 75c3521cf651..caa435a02c2e 100644 --- a/Zend/tests/type_declarations/typed_properties_009.phpt +++ b/Zend/tests/type_declarations/typed_properties_009.phpt @@ -10,7 +10,7 @@ $foo = new Foo(); unset($foo->bar); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Foo::$bar must not be unset in %s:7 +Fatal error: Uncaught TypeError: Typed property Foo::$bar must not be unset in %s:7 Stack trace: #0 {main} thrown in %s on line 7 diff --git a/Zend/tests/type_declarations/typed_properties_010.phpt b/Zend/tests/type_declarations/typed_properties_010.phpt index 8506792f37e6..c11e9284a517 100644 --- a/Zend/tests/type_declarations/typed_properties_010.phpt +++ b/Zend/tests/type_declarations/typed_properties_010.phpt @@ -14,7 +14,7 @@ $foo = new Foo(); $cb($foo->bar); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: fetching reference to Foo::$bar is disallowed in %s:11 +Fatal error: Uncaught TypeError: Typed property Foo::$bar must not be referenced in %s:11 Stack trace: #0 {main} thrown in %s on line 11 diff --git a/Zend/tests/type_declarations/typed_properties_011.phpt b/Zend/tests/type_declarations/typed_properties_011.phpt index ed9db44c6943..d958ec23d209 100644 --- a/Zend/tests/type_declarations/typed_properties_011.phpt +++ b/Zend/tests/type_declarations/typed_properties_011.phpt @@ -11,7 +11,7 @@ $foo = new Foo(); $array = [&$foo->bar]; ?> --EXPECTF-- -Fatal error: Uncaught TypeError: fetching reference to Foo::$bar is disallowed in %s:8 +Fatal error: Uncaught TypeError: Typed property Foo::$bar must not be referenced in %s:8 Stack trace: #0 {main} thrown in %s on line 8 diff --git a/Zend/tests/type_declarations/typed_properties_012.phpt b/Zend/tests/type_declarations/typed_properties_012.phpt index 47122ab762eb..d3a1f845cab7 100644 --- a/Zend/tests/type_declarations/typed_properties_012.phpt +++ b/Zend/tests/type_declarations/typed_properties_012.phpt @@ -10,7 +10,7 @@ $foo = new Foo(); foreach ($foo as &$prop); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: foreach by reference over Foo is disallowed in %s:7 +Fatal error: Uncaught TypeError: Typed properties exist in Foo: foreach by reference is disallowed in %s:7 Stack trace: #0 {main} thrown in %s on line 7 diff --git a/Zend/tests/type_declarations/typed_properties_013.phpt b/Zend/tests/type_declarations/typed_properties_013.phpt index 1bf8a6289ba6..499ed855121a 100644 --- a/Zend/tests/type_declarations/typed_properties_013.phpt +++ b/Zend/tests/type_declarations/typed_properties_013.phpt @@ -7,7 +7,7 @@ class Foo { } ?> --EXPECTF-- -Fatal error: Type of Foo::$bar must be integer, float used in %s on line 3 +Fatal error: Typed property Foo::$bar must be integer, float used 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 index c9fb16304038..af9d5c5a2746 100644 --- a/Zend/tests/type_declarations/typed_properties_014.phpt +++ b/Zend/tests/type_declarations/typed_properties_014.phpt @@ -7,7 +7,7 @@ class Foo { } ?> --EXPECTF-- -Fatal error: Type of Foo::$bar must be array, null used in %s on line 3 +Fatal error: Typed property Foo::$bar must be array, null used 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 index 3a1fb8f12af3..15643ca2a7bf 100644 --- a/Zend/tests/type_declarations/typed_properties_015.phpt +++ b/Zend/tests/type_declarations/typed_properties_015.phpt @@ -7,7 +7,7 @@ class Foo { } ?> --EXPECTF-- -Fatal error: Type of Foo::$bar must be stdClass, null used in %s on line 3 +Fatal error: Typed property Foo::$bar must be stdClass, null used in %s on line 3 diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 5350abaeaa08..2450fcd0a137 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3623,50 +3623,34 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name } if (optional_type) { - if (optional_type == IS_OBJECT) { - if (Z_TYPE_P(property) != IS_UNDEF) { + if (Z_TYPE_P(property) != IS_UNDEF) { + if (optional_type == IS_OBJECT) { zend_string *type_name = optional_type_name; - - if (zend_string_equals_literal_ci(type_name, "parent")) { - if (!ce->parent) { - zend_error(E_COMPILE_ERROR, - "Type of %s::$%s cannot be parent type, no parent scope active", - ZSTR_VAL(ce->name), - ZSTR_VAL(name)); - return FAILURE; - } - - type_name = ce->parent->name; - } - + if (zend_string_equals_literal_ci(type_name, "self")) { type_name = ce->name; } - zend_error(E_COMPILE_ERROR, - "Type of %s::$%s must be %s, %s used", + zend_error(E_COMPILE_ERROR, + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(ce->name), ZSTR_VAL(name), ZSTR_VAL(type_name), - Z_TYPE_P(property) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(property)->name) : - zend_get_type_by_const(Z_TYPE_P(property))); + zend_get_type_by_const(Z_TYPE_P(property))); return FAILURE; - } - } else if (Z_TYPE_P(property) != IS_UNDEF && !ZEND_SAME_FAKE_TYPE(optional_type, Z_TYPE_P(property))) { - zend_error(E_COMPILE_ERROR, - "Type of %s::$%s must be %s, %s used", - ZSTR_VAL(ce->name), - ZSTR_VAL(name), - zend_get_type_by_const(optional_type), - Z_TYPE_P(property) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(property)->name) : + } else if(!ZEND_SAME_FAKE_TYPE(optional_type, Z_TYPE_P(property))) { + zend_error(E_COMPILE_ERROR, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(ce->name), + ZSTR_VAL(name), + zend_get_type_by_const(optional_type), zend_get_type_by_const(Z_TYPE_P(property))); - return FAILURE; + return FAILURE; + } } } - if (Z_TYPE_P(property) == IS_UNDEF) { + if (Z_ISUNDEF_P(property)) { ZVAL_NULL(property); } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7a056230e094..fdcb32321cae 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1867,7 +1867,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", + "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -1909,7 +1909,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -2058,7 +2058,7 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -2099,7 +2099,7 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); @@ -2329,7 +2329,7 @@ ZEND_VM_C_LABEL(fast_assign_obj): if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -2340,7 +2340,7 @@ ZEND_VM_C_LABEL(fast_assign_obj): } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -5952,7 +5952,7 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -6138,7 +6138,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) if (Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) { zend_throw_exception_ex( zend_ce_type_error, 0, - "foreach by reference over %s is disallowed", + "Typed properties exist in %s: foreach by reference is disallowed", ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); HANDLE_EXCEPTION(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 13e20f5a9e5d..f594a7b6bf7b 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4266,7 +4266,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER if (Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) { zend_throw_exception_ex( zend_ce_type_error, 0, - "foreach by reference over %s is disallowed", + "Typed properties exist in %s: foreach by reference is disallowed", ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); HANDLE_EXCEPTION(); } @@ -5622,7 +5622,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", + "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -5741,7 +5741,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -9402,7 +9402,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", + "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -9521,7 +9521,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -11234,7 +11234,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", + "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -11354,7 +11354,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -12677,7 +12677,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z if (Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) { zend_throw_exception_ex( zend_ce_type_error, 0, - "foreach by reference over %s is disallowed", + "Typed properties exist in %s: foreach by reference is disallowed", ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); HANDLE_EXCEPTION(); } @@ -13187,7 +13187,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", + "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -13234,7 +13234,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -14443,7 +14443,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", + "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -14490,7 +14490,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -15000,7 +15000,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", + "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -15047,7 +15047,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -16272,7 +16272,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z if (Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) { zend_throw_exception_ex( zend_ce_type_error, 0, - "foreach by reference over %s is disallowed", + "Typed properties exist in %s: foreach by reference is disallowed", ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); HANDLE_EXCEPTION(); } @@ -17727,7 +17727,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", + "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -17758,6 +17758,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN HANDLE_EXCEPTION(); } + /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { @@ -17768,7 +17769,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -17844,7 +17845,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -17885,7 +17886,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); @@ -18071,7 +18072,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -18082,7 +18083,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -18282,7 +18283,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -18293,7 +18294,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -18493,7 +18494,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -18504,7 +18505,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -18704,7 +18705,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -18715,7 +18716,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -19666,7 +19667,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDL if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -22298,7 +22299,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", + "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -22329,6 +22330,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE HANDLE_EXCEPTION(); } + /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { @@ -22339,7 +22341,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -22415,7 +22417,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -22456,7 +22458,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HA if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); @@ -22642,7 +22644,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -22653,7 +22655,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -22853,7 +22855,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -22864,7 +22866,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -23064,7 +23066,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -23075,7 +23077,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -23275,7 +23277,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -23286,7 +23288,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -24210,7 +24212,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER( if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -25064,7 +25066,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", + "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -25095,6 +25097,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA HANDLE_EXCEPTION(); } + /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { @@ -25105,7 +25108,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -25181,7 +25184,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -25222,7 +25225,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVA if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); @@ -25408,7 +25411,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -25419,7 +25422,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -25619,7 +25622,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -25630,7 +25633,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -25830,7 +25833,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -25841,7 +25844,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -26041,7 +26044,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -26052,7 +26055,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -26866,7 +26869,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR_HAND if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -27615,7 +27618,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", + "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -27646,6 +27649,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ HANDLE_EXCEPTION(); } + /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { @@ -27656,7 +27660,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -27804,7 +27808,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -27845,7 +27849,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CO if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); @@ -28031,7 +28035,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -28042,7 +28046,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -28242,7 +28246,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -28253,7 +28257,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -28453,7 +28457,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -28464,7 +28468,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -28664,7 +28668,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -28675,7 +28679,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -29288,7 +29292,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HA if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -31134,7 +31138,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", + "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -31165,6 +31169,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN HANDLE_EXCEPTION(); } + /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { @@ -31175,7 +31180,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -31323,7 +31328,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -31364,7 +31369,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); @@ -31550,7 +31555,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -31561,7 +31566,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -31761,7 +31766,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -31772,7 +31777,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -31972,7 +31977,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -31983,7 +31988,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -32183,7 +32188,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -32194,7 +32199,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -32681,7 +32686,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDL if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -33595,7 +33600,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", + "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -33626,6 +33631,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR HANDLE_EXCEPTION(); } + /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { @@ -33636,7 +33642,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -33785,7 +33791,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -33826,7 +33832,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TM if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); @@ -34012,7 +34018,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -34023,7 +34029,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -34223,7 +34229,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -34234,7 +34240,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -34434,7 +34440,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -34445,7 +34451,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -34645,7 +34651,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -34656,7 +34662,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -35145,7 +35151,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR_H if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -36723,7 +36729,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE if (Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) { zend_throw_exception_ex( zend_ce_type_error, 0, - "foreach by reference over %s is disallowed", + "Typed properties exist in %s: foreach by reference is disallowed", ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); HANDLE_EXCEPTION(); } @@ -38642,7 +38648,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", + "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -38673,6 +38679,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND HANDLE_EXCEPTION(); } + /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { @@ -38683,7 +38690,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -38831,7 +38838,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -38872,7 +38879,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_ if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); @@ -39102,7 +39109,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -39113,7 +39120,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -39313,7 +39320,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -39324,7 +39331,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -39524,7 +39531,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -39535,7 +39542,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -39735,7 +39742,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -39746,7 +39753,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -40777,7 +40784,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLE if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -45224,7 +45231,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", + "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -45255,6 +45262,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER HANDLE_EXCEPTION(); } + /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { @@ -45265,7 +45273,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -45413,7 +45421,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -45454,7 +45462,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HAN if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); @@ -45640,7 +45648,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -45651,7 +45659,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -45851,7 +45859,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -45862,7 +45870,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -46062,7 +46070,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -46073,7 +46081,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -46273,7 +46281,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -46284,7 +46292,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -47311,7 +47319,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(Z if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -48976,7 +48984,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s accessed before initialization", + "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); @@ -49007,6 +49015,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN HANDLE_EXCEPTION(); } + /* TODO(krakjoe) deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { @@ -49017,7 +49026,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -49166,7 +49175,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP if (prop_info && prop_info->type) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "fetching reference to %s::$%s is disallowed", + "Typed property %s::$%s must not be referenced", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -49207,7 +49216,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); @@ -49393,7 +49402,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -49404,7 +49413,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -49604,7 +49613,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -49615,7 +49624,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -49815,7 +49824,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -49826,7 +49835,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -50026,7 +50035,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be an instance of %s, %s used", + "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), ZSTR_VAL(zend_resolve_property_type(prop_info)), @@ -50037,7 +50046,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must be %s, %s used", + "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), zend_get_type_by_const(prop_info->type), @@ -50956,7 +50965,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMPVAR_HANDL if (prop_info && prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "%s::$%s must not be unset", + "Typed property %s::$%s must not be unset", ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); From 7159da698942f6d42b2fab9a79f0a453a36d04d7 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 8 Mar 2016 08:00:10 +0000 Subject: [PATCH 033/369] cache class entry in property info --- Zend/zend_compile.h | 1 + Zend/zend_vm_def.h | 4 +- Zend/zend_vm_execute.h | 144 ++++++++++++++++++++--------------------- 3 files changed, 75 insertions(+), 74 deletions(-) diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 6d2d1b7f46ce..3abc80adce17 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -301,6 +301,7 @@ typedef struct _zend_property_info { zend_class_entry *ce; zend_uchar type; zend_string *type_name; + zend_class_entry *type_ce; } zend_property_info; #define OBJ_PROP(obj, offset) \ diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index fdcb32321cae..895305235355 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2324,8 +2324,8 @@ ZEND_VM_C_LABEL(fast_assign_obj): if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index f594a7b6bf7b..6cba494e5e0f 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18067,8 +18067,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -18278,8 +18278,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -18489,8 +18489,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -18700,8 +18700,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -22639,8 +22639,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -22850,8 +22850,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -23061,8 +23061,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -23272,8 +23272,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -25406,8 +25406,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -25617,8 +25617,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -25828,8 +25828,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -26039,8 +26039,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -28030,8 +28030,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -28241,8 +28241,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -28452,8 +28452,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -28663,8 +28663,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -31550,8 +31550,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -31761,8 +31761,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -31972,8 +31972,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -32183,8 +32183,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -34013,8 +34013,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -34224,8 +34224,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -34435,8 +34435,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -34646,8 +34646,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -39104,8 +39104,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -39315,8 +39315,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -39526,8 +39526,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -39737,8 +39737,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -45643,8 +45643,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -45854,8 +45854,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -46065,8 +46065,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -46276,8 +46276,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -49397,8 +49397,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -49608,8 +49608,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -49819,8 +49819,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -50030,8 +50030,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - /* TODO(krakjoe) needs a cache slot */ - zend_class_entry *ce = zend_lookup_class(prop_info->type_name); + zend_class_entry *ce = prop_info->type_ce == NULL ? + (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, From ef2531c8e61bfe03daea92dfd5a2533bc8146d66 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 8 Mar 2016 08:04:19 +0000 Subject: [PATCH 034/369] nothing --- Zend/zend_API.c | 1 + ext/opcache/zend_persist.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 2450fcd0a137..c6a3b6a24ac8 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3711,6 +3711,7 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name property_info->type = optional_type; property_info->type_name = optional_type_name ? zend_new_interned_string(optional_type_name) : NULL; + property_info->type_ce = NULL; zend_hash_update_ptr(&ce->properties_info, name, property_info); diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index 77174cf4b1c5..d2efa13d649b 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -717,6 +717,8 @@ static void zend_persist_property_info(zval *zv) if (prop->type_name) { zend_accel_store_string(prop->type_name); + + prop->type_ce = NULL; } } From 414fb839fcce79dcc2b5d0ba9a485d16c314f737 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 8 Mar 2016 09:47:20 +0000 Subject: [PATCH 035/369] resolve property type --- Zend/zend_vm_def.h | 12 +- Zend/zend_vm_execute.h | 432 ++++++++++++++++++++++++++++++----------- 2 files changed, 333 insertions(+), 111 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 895305235355..c998c3a90bdd 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2324,15 +2324,21 @@ ZEND_VM_C_LABEL(fast_assign_obj): if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6cba494e5e0f..fc15b368b855 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18067,15 +18067,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -18278,15 +18284,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -18489,15 +18501,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -18700,15 +18718,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -22639,15 +22663,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -22850,15 +22880,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -23061,15 +23097,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -23272,15 +23314,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -25406,15 +25454,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -25617,15 +25671,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -25828,15 +25888,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -26039,15 +26105,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -28030,15 +28102,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -28241,15 +28319,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -28452,15 +28536,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -28663,15 +28753,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -31550,15 +31646,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -31761,15 +31863,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -31972,15 +32080,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -32183,15 +32297,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -34013,15 +34133,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -34224,15 +34350,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -34435,15 +34567,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -34646,15 +34784,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -39104,15 +39248,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -39315,15 +39465,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -39526,15 +39682,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -39737,15 +39899,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -45643,15 +45811,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -45854,15 +46028,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -46065,15 +46245,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -46276,15 +46462,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -49397,15 +49589,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -49608,15 +49806,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -49819,15 +50023,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); @@ -50030,15 +50240,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (prop_info && prop_info->type) { if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = prop_info->type_ce == NULL ? - (prop_info->type_ce = zend_lookup_class(prop_info->type_name)) : prop_info->type_ce; + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info)), + ZSTR_VAL(resolved), Z_TYPE_P(value) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); From 8095119b0891661cf0ecc2e9f855a21d7133540b Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 8 Mar 2016 14:23:31 +0000 Subject: [PATCH 036/369] add void check during compile --- .../type_declarations/typed_properties_017.phpt | 16 ++++++++++++++++ Zend/zend_compile.c | 10 ++++++++++ 2 files changed, 26 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_017.phpt 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 000000000000..4d344b93fed9 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_017.phpt @@ -0,0 +1,16 @@ +--TEST-- +Test typed no void +--FILE-- + +--EXPECTF-- +Fatal error: Typed property Foo::$int must not be void in %s on line 3 + + + + diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index bc71fd21ce44..973a850be65b 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5326,6 +5326,7 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ zend_string *optional_type_name = NULL; if (type_ast) { + if (type_ast->kind == ZEND_AST_TYPE) { optional_type = type_ast->attr; } else { @@ -5338,9 +5339,18 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ "Scalar type declaration '%s' must be unqualified", ZSTR_VAL(zend_string_tolower(class_name))); } + + if (type == IS_VOID) { + zend_error_noreturn(E_COMPILE_ERROR, + "Typed property %s::$%s must not be void", + ZSTR_VAL(ce->name), + ZSTR_VAL(name)); + } + optional_type = type; } else { uint32_t fetch_type = zend_get_class_fetch_type_ast(type_ast); + if (fetch_type == ZEND_FETCH_CLASS_DEFAULT) { class_name = zend_resolve_class_name_ast(type_ast); zend_assert_valid_class_name(class_name); From f5fdbf1db9ce7a8e17708eeca72904d6c1a25d1b Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 8 Mar 2016 14:31:23 +0000 Subject: [PATCH 037/369] tidy --- Zend/zend_vm_def.h | 28 +- Zend/zend_vm_execute.h | 936 ++++++++++++++++++++--------------------- 2 files changed, 482 insertions(+), 482 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index c998c3a90bdd..896548c242f3 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2326,7 +2326,7 @@ ZEND_VM_C_LABEL(fast_assign_obj): if (prop_info->type == IS_OBJECT) { zend_class_entry *ce = NULL; zend_string *resolved = zend_resolve_property_type(prop_info); - + if (!prop_info->type_ce) { ce = prop_info->type_ce = zend_lookup_class(resolved); } else { @@ -2335,24 +2335,24 @@ ZEND_VM_C_LABEL(fast_assign_obj): if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index fc15b368b855..6d1ced76d231 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18078,24 +18078,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -18295,24 +18295,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -18512,24 +18512,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -18729,24 +18729,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -22674,24 +22674,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -22891,24 +22891,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -23108,24 +23108,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -23325,24 +23325,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -25465,24 +25465,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -25682,24 +25682,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -25899,24 +25899,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -26116,24 +26116,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -28113,24 +28113,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -28330,24 +28330,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -28547,24 +28547,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -28764,24 +28764,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -31657,24 +31657,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -31874,24 +31874,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -32091,24 +32091,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -32308,24 +32308,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -34144,24 +34144,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -34361,24 +34361,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -34578,24 +34578,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -34795,24 +34795,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -39259,24 +39259,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -39476,24 +39476,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -39693,24 +39693,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -39910,24 +39910,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -45822,24 +45822,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -46039,24 +46039,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -46256,24 +46256,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -46473,24 +46473,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -49600,24 +49600,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -49817,24 +49817,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -50034,24 +50034,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } @@ -50251,24 +50251,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); HANDLE_EXCEPTION(); } } From 8679c7acd3802358fad1a6fcde44703a74d1eabb Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 8 Mar 2016 16:16:33 +0000 Subject: [PATCH 038/369] allow overflow of int->long, deref container in fetch_obj_w --- .../typed_properties_013.phpt | 4 +- Zend/zend_API.c | 51 +- Zend/zend_vm_def.h | 119 +- Zend/zend_vm_execute.h | 2963 ++++++++++------- 4 files changed, 1853 insertions(+), 1284 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_013.phpt b/Zend/tests/type_declarations/typed_properties_013.phpt index 499ed855121a..b6e297df4711 100644 --- a/Zend/tests/type_declarations/typed_properties_013.phpt +++ b/Zend/tests/type_declarations/typed_properties_013.phpt @@ -3,11 +3,11 @@ Test typed disallow incorrect type initial value (scalar) --FILE-- --EXPECTF-- -Fatal error: Typed property Foo::$bar must be integer, float used in %s on line 3 +Fatal error: Typed property Foo::$bar must be integer, string used in %s on line 3 diff --git a/Zend/zend_API.c b/Zend/zend_API.c index c6a3b6a24ac8..c7e537998a95 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3624,28 +3624,37 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name if (optional_type) { if (Z_TYPE_P(property) != IS_UNDEF) { - if (optional_type == IS_OBJECT) { - zend_string *type_name = optional_type_name; - - if (zend_string_equals_literal_ci(type_name, "self")) { - type_name = ce->name; - } + switch (optional_type) { + case IS_OBJECT: { + zend_string *type_name = optional_type_name; - zend_error(E_COMPILE_ERROR, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(ce->name), - ZSTR_VAL(name), - ZSTR_VAL(type_name), - zend_get_type_by_const(Z_TYPE_P(property))); - return FAILURE; - } else if(!ZEND_SAME_FAKE_TYPE(optional_type, Z_TYPE_P(property))) { - zend_error(E_COMPILE_ERROR, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(ce->name), - ZSTR_VAL(name), - zend_get_type_by_const(optional_type), - zend_get_type_by_const(Z_TYPE_P(property))); - return FAILURE; + if (zend_string_equals_literal_ci(type_name, "self")) { + type_name = ce->name; + } + + zend_error(E_COMPILE_ERROR, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(ce->name), + ZSTR_VAL(name), + ZSTR_VAL(type_name), + zend_get_type_by_const(Z_TYPE_P(property))); + return FAILURE; + } break; + + case IS_LONG: + if (Z_TYPE_P(property) == IS_DOUBLE) + break; + + default: + if(!ZEND_SAME_FAKE_TYPE(optional_type, Z_TYPE_P(property))) { + zend_error(E_COMPILE_ERROR, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(ce->name), + ZSTR_VAL(name), + zend_get_type_by_const(optional_type), + zend_get_type_by_const(Z_TYPE_P(property))); + return FAILURE; + } } } } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 896548c242f3..2402d1be2058 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1898,24 +1898,43 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + zval *obj = container; + + do { + if (OP1_TYPE == IS_CONST || + (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { + if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { + obj = Z_REFVAL_P(obj); + if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { + break; } - } break; + } else { + break; + } } - } + + if (Z_TYPE_P(obj) != IS_OBJECT) { + break; + } + + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; + } + } + } while (0); } zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -2323,37 +2342,47 @@ ZEND_VM_C_LABEL(fast_assign_obj): zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6d1ced76d231..4d836c9747d4 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17758,24 +17758,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + zval *obj = container; + + do { + if (IS_VAR == IS_CONST || + (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { + if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { + obj = Z_REFVAL_P(obj); + if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { + break; } - } break; + } else { + break; + } } - } + + if (Z_TYPE_P(obj) != IS_OBJECT) { + break; + } + + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; + } + } + } while (0); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -18066,37 +18085,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -18283,37 +18312,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -18500,37 +18539,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -18717,37 +18766,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -22354,24 +22413,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + zval *obj = container; - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + do { + if (IS_VAR == IS_CONST || + (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { + if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { + obj = Z_REFVAL_P(obj); + if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { + break; } - } break; + } else { + break; + } } - } + + if (Z_TYPE_P(obj) != IS_OBJECT) { + break; + } + + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; + } + } + } while (0); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -22662,37 +22740,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -22879,37 +22967,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -23096,37 +23194,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -23313,37 +23421,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -25145,24 +25263,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + zval *obj = container; - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + do { + if (IS_VAR == IS_CONST || + (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { + if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { + obj = Z_REFVAL_P(obj); + if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { + break; } - } break; + } else { + break; + } } - } + + if (Z_TYPE_P(obj) != IS_OBJECT) { + break; + } + + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; + } + } + } while (0); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -25453,37 +25590,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -25670,37 +25817,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -25887,37 +26044,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -26104,37 +26271,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -27721,24 +27898,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + zval *obj = container; - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + do { + if (IS_UNUSED == IS_CONST || + (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { + if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { + obj = Z_REFVAL_P(obj); + if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { + break; } - } break; + } else { + break; + } } - } + + if (Z_TYPE_P(obj) != IS_OBJECT) { + break; + } + + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; + } + } + } while (0); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -28101,37 +28297,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -28318,37 +28524,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -28535,37 +28751,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -28752,37 +28978,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -31265,24 +31501,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + zval *obj = container; - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + do { + if (IS_UNUSED == IS_CONST || + (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { + if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { + obj = Z_REFVAL_P(obj); + if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { + break; } - } break; + } else { + break; + } } - } + + if (Z_TYPE_P(obj) != IS_OBJECT) { + break; + } + + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; + } + } + } while (0); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -31645,37 +31900,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -31862,37 +32127,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -32079,37 +32354,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -32296,37 +32581,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -33751,24 +34046,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + zval *obj = container; - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + do { + if (IS_UNUSED == IS_CONST || + (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { + if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { + obj = Z_REFVAL_P(obj); + if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { + break; } - } break; + } else { + break; + } } - } + + if (Z_TYPE_P(obj) != IS_OBJECT) { + break; + } + + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; + } + } + } while (0); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -34132,37 +34446,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -34349,37 +34673,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); + + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -34566,37 +34900,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -34783,37 +35127,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -38823,24 +39177,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + zval *obj = container; - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + do { + if (IS_CV == IS_CONST || + (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { + if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { + obj = Z_REFVAL_P(obj); + if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { + break; } - } break; + } else { + break; + } } - } + + if (Z_TYPE_P(obj) != IS_OBJECT) { + break; + } + + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; + } + } + } while (0); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -39247,37 +39620,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -39464,37 +39847,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -39681,37 +40074,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -39898,37 +40301,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -45430,24 +45843,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + zval *obj = container; - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + do { + if (IS_CV == IS_CONST || + (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { + if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { + obj = Z_REFVAL_P(obj); + if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { + break; } - } break; + } else { + break; + } } - } + + if (Z_TYPE_P(obj) != IS_OBJECT) { + break; + } + + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; + } + } + } while (0); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -45810,37 +46242,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -46027,37 +46469,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -46244,37 +46696,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -46461,37 +46923,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -49207,24 +49679,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + zval *obj = container; - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); + do { + if (IS_CV == IS_CONST || + (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { + if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { + obj = Z_REFVAL_P(obj); + if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { + break; } - } break; + } else { + break; + } } - } + + if (Z_TYPE_P(obj) != IS_OBJECT) { + break; + } + + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + } break; + } + } + } while (0); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -49588,37 +50079,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -49805,37 +50306,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -50022,37 +50533,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } @@ -50239,37 +50760,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (prop_info->type == IS_OBJECT) { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); + switch (prop_info->type) { + case IS_OBJECT: { + zend_class_entry *ce = NULL; + zend_string *resolved = zend_resolve_property_type(prop_info); - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } else if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); + if (!prop_info->type_ce) { + ce = prop_info->type_ce = zend_lookup_class(resolved); + } else { + ce = prop_info->type_ce; + } + + if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(resolved), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } + } break; + + case IS_LONG: + /* we must allow long to overflow */ + if (Z_TYPE_P(value) == IS_DOUBLE) + break; + + default: + if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } } } } From 40b1409b9dd407aeb5cf9596bf74ab71b1db113e Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 8 Mar 2016 16:45:59 +0000 Subject: [PATCH 039/369] functions are good ? --- Zend/zend_API.c | 37 +- Zend/zend_execute.c | 26 + Zend/zend_execute.h | 2 + Zend/zend_inheritance.c | 20 +- Zend/zend_inheritance.h | 2 +- Zend/zend_vm_def.h | 61 +- Zend/zend_vm_execute.h | 2196 ++++++++++++++------------------------- 7 files changed, 831 insertions(+), 1513 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index c7e537998a95..3cf7f067d364 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3624,14 +3624,14 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name if (optional_type) { if (Z_TYPE_P(property) != IS_UNDEF) { - switch (optional_type) { - case IS_OBJECT: { - zend_string *type_name = optional_type_name; + zend_string *type_name = optional_type_name; - if (zend_string_equals_literal_ci(type_name, "self")) { - type_name = ce->name; - } + if (type_name && zend_string_equals_literal_ci(type_name, "self")) { + type_name = ce->name; + } + if (!zend_verify_property_type(optional_type, type_name, NULL, ce, property, 0)) { + if (optional_type == IS_OBJECT) { zend_error(E_COMPILE_ERROR, "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(ce->name), @@ -3639,22 +3639,15 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name ZSTR_VAL(type_name), zend_get_type_by_const(Z_TYPE_P(property))); return FAILURE; - } break; - - case IS_LONG: - if (Z_TYPE_P(property) == IS_DOUBLE) - break; - - default: - if(!ZEND_SAME_FAKE_TYPE(optional_type, Z_TYPE_P(property))) { - zend_error(E_COMPILE_ERROR, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(ce->name), - ZSTR_VAL(name), - zend_get_type_by_const(optional_type), - zend_get_type_by_const(Z_TYPE_P(property))); - return FAILURE; - } + } else { + zend_error(E_COMPILE_ERROR, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(ce->name), + ZSTR_VAL(name), + zend_get_type_by_const(optional_type), + zend_get_type_by_const(Z_TYPE_P(property))); + return FAILURE; + } } } } diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index de5875fdba68..7e5fe00e85e5 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -776,6 +776,32 @@ static int zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, zv return 1; } +zend_bool zend_verify_property_type(zend_uchar type, zend_string *type_name, zend_class_entry **type_ce, zend_class_entry *scope, zval *property, zend_bool resolve) { + switch (type) { + case IS_OBJECT: { + zend_class_entry *pce = type_ce ? *type_ce : NULL; + zend_string *resolved = resolve ? zend_resolve_property_type(type_name, scope) : type_name; + + if (!pce) { + pce = zend_lookup_class(resolved); + + if (type_ce) { + *type_ce = pce; + } + } + + return Z_TYPE_P(property) == IS_OBJECT && instanceof_function(pce, Z_OBJCE_P(property)); + } break; + + case IS_LONG: + if (Z_TYPE_P(property) == IS_DOUBLE) + return 1; + + default: + return ZEND_SAME_FAKE_TYPE(type, Z_TYPE_P(property)); + } +} + static zend_always_inline int zend_verify_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot) { zend_arg_info *cur_arg_info; diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 00c651fdfe90..7b885439c2b1 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -362,6 +362,8 @@ void zend_cleanup_unfinished_execution(zend_execute_data *execute_data, uint32_t } \ } while (0) +zend_bool zend_verify_property_type(zend_uchar type, zend_string *type_name, zend_class_entry **type_ce, zend_class_entry *scope, zval *property, zend_bool resolve); + END_EXTERN_C() #endif /* ZEND_EXECUTE_H */ diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 0a8c339cd403..5750e0a2f7a5 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -618,23 +618,23 @@ static zend_function *do_inherit_method(zend_string *key, zend_function *parent, } /* }}} */ -zend_string* zend_resolve_property_type(zend_property_info *info) /* {{{ */ +zend_string* zend_resolve_property_type(zend_string *name, zend_class_entry *scope) /* {{{ */ { - zend_string *type = info->type_name; + zend_string *type = name; if (!type) { return NULL; } if (zend_string_equals_literal_ci(type, "parent")) { - if (info && info->ce && info->ce->parent) { - return info->ce->parent->name; + if (scope && scope->parent) { + return scope->parent->name; } } if (zend_string_equals_literal_ci(type, "self")) { - if (info && info->ce) { - return info->ce->name; + if (scope) { + return scope->name; } } @@ -653,13 +653,13 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke /* TODO(krakjoe) comparing strings feels wrong */ if (parent_info->type == IS_OBJECT) { if (child_info->type != IS_OBJECT || - !zend_string_equals_ci(zend_resolve_property_type(parent_info), - zend_resolve_property_type(child_info))) { + !zend_string_equals_ci(zend_resolve_property_type(parent_info->type_name, parent_info->ce), + zend_resolve_property_type(child_info->type_name, child_info->ce))) { zend_error_noreturn(E_COMPILE_ERROR, "Type of %s::$%s must be %s (as in class %s)", ZSTR_VAL(ce->name), ZSTR_VAL(key), - ZSTR_VAL(zend_resolve_property_type(parent_info)), + ZSTR_VAL(zend_resolve_property_type(parent_info->type_name, parent_info->ce)), ZSTR_VAL(ce->parent->name)); } } else if (parent_info->type != child_info->type) { @@ -704,7 +704,7 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke "Type of %s::$%s must be %s (as in class %s)", ZSTR_VAL(ce->name), ZSTR_VAL(key), - ZSTR_VAL(zend_resolve_property_type(parent_info)), + ZSTR_VAL(zend_resolve_property_type(parent_info->type_name, parent_info->ce)), ZSTR_VAL(ce->parent->name)); } else { zend_error_noreturn(E_COMPILE_ERROR, diff --git a/Zend/zend_inheritance.h b/Zend/zend_inheritance.h index 37a912fc2ac4..1ea0aa68f718 100644 --- a/Zend/zend_inheritance.h +++ b/Zend/zend_inheritance.h @@ -35,7 +35,7 @@ void zend_do_early_binding(void); void zend_check_deprecated_constructor(const zend_class_entry *ce); -ZEND_API zend_string* zend_resolve_property_type(zend_property_info *info); +ZEND_API zend_string* zend_resolve_property_type(zend_string *name, zend_class_entry *scope); END_EXTERN_C() diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 2402d1be2058..aac350be0537 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2342,47 +2342,28 @@ ZEND_VM_C_LABEL(fast_assign_obj): zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 4d836c9747d4..29d560a1fba0 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18085,47 +18085,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -18312,47 +18293,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -18539,47 +18501,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -18766,47 +18709,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -22740,47 +22664,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -22967,47 +22872,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -23194,47 +23080,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -23421,47 +23288,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -25590,47 +25438,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -25817,47 +25646,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -26044,47 +25854,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -26271,47 +26062,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -28297,47 +28069,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -28524,47 +28277,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -28751,47 +28485,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -28978,47 +28693,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -31900,47 +31596,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -32127,47 +31804,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -32354,47 +32012,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -32581,47 +32220,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -34446,47 +34066,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -34673,47 +34274,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -34900,47 +34482,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -35127,47 +34690,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -39620,47 +39164,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -39847,47 +39372,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -40074,47 +39580,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -40301,47 +39788,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -46242,47 +45710,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -46469,47 +45918,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -46696,47 +46126,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -46923,47 +46334,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -50079,47 +49471,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -50306,47 +49679,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -50533,47 +49887,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } @@ -50760,47 +50095,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - switch (prop_info->type) { - case IS_OBJECT: { - zend_class_entry *ce = NULL; - zend_string *resolved = zend_resolve_property_type(prop_info); - - if (!prop_info->type_ce) { - ce = prop_info->type_ce = zend_lookup_class(resolved); - } else { - ce = prop_info->type_ce; - } - - if (Z_TYPE_P(value) != IS_OBJECT || !instanceof_function(ce, Z_OBJCE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(resolved), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : + if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { + if (prop_info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : + zend_get_type_by_const(Z_TYPE_P(value))); + HANDLE_EXCEPTION(); + } else { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property_name), + zend_get_type_by_const(prop_info->type), + Z_TYPE_P(value) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(value)->name) : zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } - } break; - - case IS_LONG: - /* we must allow long to overflow */ - if (Z_TYPE_P(value) == IS_DOUBLE) - break; - - default: - if (!ZEND_SAME_FAKE_TYPE(prop_info->type, Z_TYPE_P(value))) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } } } } From 607717185fcc0421810b29cf6d073dfd759b6013 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 8 Mar 2016 16:58:39 +0000 Subject: [PATCH 040/369] more refactor --- .../typed_properties_015.phpt | 2 +- Zend/zend_API.c | 20 +- Zend/zend_execute.c | 50 +- Zend/zend_execute.h | 2 +- Zend/zend_vm_def.h | 24 +- Zend/zend_vm_execute.h | 864 ++---------------- 6 files changed, 124 insertions(+), 838 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_015.phpt b/Zend/tests/type_declarations/typed_properties_015.phpt index 15643ca2a7bf..088e45d091ff 100644 --- a/Zend/tests/type_declarations/typed_properties_015.phpt +++ b/Zend/tests/type_declarations/typed_properties_015.phpt @@ -7,7 +7,7 @@ class Foo { } ?> --EXPECTF-- -Fatal error: Typed property Foo::$bar must be stdClass, null used in %s on line 3 +Fatal error: Typed property Foo::$bar must be an instance of stdClass, null used in %s on line 3 diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 3cf7f067d364..0bdc3706a741 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3630,24 +3630,8 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name type_name = ce->name; } - if (!zend_verify_property_type(optional_type, type_name, NULL, ce, property, 0)) { - if (optional_type == IS_OBJECT) { - zend_error(E_COMPILE_ERROR, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(ce->name), - ZSTR_VAL(name), - ZSTR_VAL(type_name), - zend_get_type_by_const(Z_TYPE_P(property))); - return FAILURE; - } else { - zend_error(E_COMPILE_ERROR, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(ce->name), - ZSTR_VAL(name), - zend_get_type_by_const(optional_type), - zend_get_type_by_const(Z_TYPE_P(property))); - return FAILURE; - } + if (!zend_verify_property_type(ce, name, optional_type, type_name, NULL, property, 0)) { + return FAILURE; } } } diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 7e5fe00e85e5..82632d8b0ea5 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -776,11 +776,11 @@ static int zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, zv return 1; } -zend_bool zend_verify_property_type(zend_uchar type, zend_string *type_name, zend_class_entry **type_ce, zend_class_entry *scope, zval *property, zend_bool resolve) { +zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, zend_uchar type, zend_string *type_name, zend_class_entry **type_ce, zval *property, zend_bool runtime) { switch (type) { case IS_OBJECT: { zend_class_entry *pce = type_ce ? *type_ce : NULL; - zend_string *resolved = resolve ? zend_resolve_property_type(type_name, scope) : type_name; + zend_string *resolved = runtime ? zend_resolve_property_type(type_name, scope) : type_name; if (!pce) { pce = zend_lookup_class(resolved); @@ -790,7 +790,28 @@ zend_bool zend_verify_property_type(zend_uchar type, zend_string *type_name, zen } } - return Z_TYPE_P(property) == IS_OBJECT && instanceof_function(pce, Z_OBJCE_P(property)); + if (Z_TYPE_P(property) != IS_OBJECT || !instanceof_function(pce, Z_OBJCE_P(property))) { + if (runtime) { + zend_throw_exception_ex(zend_ce_type_error, type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(scope->name), + ZSTR_VAL(name), + ZSTR_VAL(resolved), + Z_TYPE_P(property) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(property)->name) : + zend_get_type_by_const(Z_TYPE_P(property))); + } else { + zend_error(E_COMPILE_ERROR, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(scope->name), + ZSTR_VAL(name), + ZSTR_VAL(resolved), + Z_TYPE_P(property) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(property)->name) : + zend_get_type_by_const(Z_TYPE_P(property))); + } + } + return 1; } break; case IS_LONG: @@ -798,7 +819,28 @@ zend_bool zend_verify_property_type(zend_uchar type, zend_string *type_name, zen return 1; default: - return ZEND_SAME_FAKE_TYPE(type, Z_TYPE_P(property)); + if (!ZEND_SAME_FAKE_TYPE(type, Z_TYPE_P(property))) { + if (runtime) { + zend_throw_exception_ex(zend_ce_type_error, type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(scope->name), + ZSTR_VAL(name), + zend_get_type_by_const(type), + Z_TYPE_P(property) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(property)->name) : + zend_get_type_by_const(Z_TYPE_P(property))); + } else { + zend_error(E_COMPILE_ERROR, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(scope->name), + ZSTR_VAL(name), + zend_get_type_by_const(type), + Z_TYPE_P(property) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(property)->name) : + zend_get_type_by_const(Z_TYPE_P(property))); + } + } + return 1; } } diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 7b885439c2b1..133ace955d02 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -362,7 +362,7 @@ void zend_cleanup_unfinished_execution(zend_execute_data *execute_data, uint32_t } \ } while (0) -zend_bool zend_verify_property_type(zend_uchar type, zend_string *type_name, zend_class_entry **type_ce, zend_class_entry *scope, zval *property, zend_bool resolve); +zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, zend_uchar type, zend_string *type_name, zend_class_entry **type_ce, zval *property, zend_bool resolve); END_EXTERN_C() diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index aac350be0537..b7bd4bad44eb 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2342,28 +2342,8 @@ ZEND_VM_C_LABEL(fast_assign_obj): zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 29d560a1fba0..f772262c1005 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18085,28 +18085,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -18293,28 +18273,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -18501,28 +18461,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -18709,28 +18649,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -22664,28 +22584,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -22872,28 +22772,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -23080,28 +22960,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -23288,28 +23148,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -25438,28 +25278,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -25646,28 +25466,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -25854,28 +25654,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -26062,28 +25842,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -28069,28 +27829,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -28277,28 +28017,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -28485,28 +28205,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -28693,28 +28393,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -31596,28 +31276,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -31804,28 +31464,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -32012,28 +31652,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -32220,28 +31840,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -34066,28 +33666,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -34274,28 +33854,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -34482,28 +34042,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -34690,28 +34230,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -39164,28 +38684,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -39372,28 +38872,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -39580,28 +39060,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -39788,28 +39248,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -45710,28 +45150,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -45918,28 +45338,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -46126,28 +45526,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -46334,28 +45714,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -49471,28 +48831,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -49679,28 +49019,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -49887,28 +49207,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } @@ -50095,28 +49395,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->type, prop_info->type_name, &prop_info->type_ce, prop_info->ce, value, 1)) { - if (prop_info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - ZSTR_VAL(zend_resolve_property_type(prop_info->type_name, prop_info->ce)), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } else { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property_name), - zend_get_type_by_const(prop_info->type), - Z_TYPE_P(value) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(value)->name) : - zend_get_type_by_const(Z_TYPE_P(value))); - HANDLE_EXCEPTION(); - } + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); } } } From 6e961f0b4851d585f520848b55ba79a5055623c2 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 8 Mar 2016 17:00:26 +0000 Subject: [PATCH 041/369] urm ... we'll want a return value that makes sense --- Zend/zend_execute.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 82632d8b0ea5..ebed2d7efd73 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -810,9 +810,10 @@ zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, ZSTR_VAL(Z_OBJCE_P(property)->name) : zend_get_type_by_const(Z_TYPE_P(property))); } + return 0; } return 1; - } break; + } case IS_LONG: if (Z_TYPE_P(property) == IS_DOUBLE) @@ -839,6 +840,7 @@ zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, ZSTR_VAL(Z_OBJCE_P(property)->name) : zend_get_type_by_const(Z_TYPE_P(property))); } + return 0; } return 1; } From a98b4b38b010fbf7fcdf008ed8485bbd73276324 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 8 Mar 2016 17:04:36 +0000 Subject: [PATCH 042/369] remove todo --- Zend/zend_inheritance.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 5750e0a2f7a5..fcf5861be056 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -648,9 +648,8 @@ 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->type && !(parent_info->flags & ZEND_ACC_PRIVATE))) { - /* TODO(krakjoe) comparing strings feels wrong */ + if (UNEXPECTED(parent_info->type && !(parent_info->flags & ZEND_ACC_PRIVATE))) { if (parent_info->type == IS_OBJECT) { if (child_info->type != IS_OBJECT || !zend_string_equals_ci(zend_resolve_property_type(parent_info->type_name, parent_info->ce), From 0825a9d995a140fb14410e3513adf9e81c684f3b Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 8 Mar 2016 17:20:47 +0000 Subject: [PATCH 043/369] ... --- Zend/zend_inheritance.h | 2 +- Zend/zend_vm_def.h | 59 ++-- Zend/zend_vm_execute.h | 585 ++++++++++++++++------------------------ 3 files changed, 251 insertions(+), 395 deletions(-) diff --git a/Zend/zend_inheritance.h b/Zend/zend_inheritance.h index 1ea0aa68f718..0a3e380e0e60 100644 --- a/Zend/zend_inheritance.h +++ b/Zend/zend_inheritance.h @@ -35,7 +35,7 @@ void zend_do_early_binding(void); void zend_check_deprecated_constructor(const zend_class_entry *ce); -ZEND_API zend_string* zend_resolve_property_type(zend_string *name, zend_class_entry *scope); +zend_string* zend_resolve_property_type(zend_string *name, zend_class_entry *scope); END_EXTERN_C() diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b7bd4bad44eb..87ebb3e00cad 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1861,7 +1861,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && @@ -1898,43 +1898,25 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zval *obj = container; - - do { - if (OP1_TYPE == IS_CONST || - (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { - if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { - obj = Z_REFVAL_P(obj); - if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { - break; + /* TODO(krakjoe) deref container ... grrr */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + /* TODO(krakjoe) needs caching */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - } else { - break; - } + } break; } - - if (Z_TYPE_P(obj) != IS_OBJECT) { - break; - } - - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } break; - } - } - } while (0); + } } zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -2072,6 +2054,7 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -2114,6 +2097,7 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) property = GET_OP2_ZVAL_PTR(BP_VAR_R); if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -2338,7 +2322,7 @@ ZEND_VM_C_LABEL(fast_assign_obj): if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -5944,6 +5928,7 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) } if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index f772262c1005..9db51b649a8a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5616,7 +5616,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && @@ -5736,6 +5736,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -9396,7 +9397,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && @@ -9516,6 +9517,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -11228,7 +11230,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && @@ -11349,6 +11351,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -13181,7 +13184,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && @@ -13229,6 +13232,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -14437,7 +14441,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && @@ -14485,6 +14489,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -14994,7 +14999,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && @@ -15042,6 +15047,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -17721,7 +17727,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && @@ -17758,43 +17764,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zval *obj = container; + /* TODO(krakjoe) deref container ... grrr */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + /* TODO(krakjoe) needs caching */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - do { - if (IS_VAR == IS_CONST || - (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { - if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { - obj = Z_REFVAL_P(obj); - if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { - break; + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - } else { - break; - } + } break; } - - if (Z_TYPE_P(obj) != IS_OBJECT) { - break; - } - - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } break; - } - } - } while (0); + } } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -17859,6 +17847,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -17901,6 +17890,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST property = EX_CONSTANT(opline->op2); if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -18081,7 +18071,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -18269,7 +18259,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -18457,7 +18447,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -18645,7 +18635,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -19590,6 +19580,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDL } if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type) { @@ -22220,7 +22211,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && @@ -22257,43 +22248,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zval *obj = container; + /* TODO(krakjoe) deref container ... grrr */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + /* TODO(krakjoe) needs caching */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - do { - if (IS_VAR == IS_CONST || - (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { - if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { - obj = Z_REFVAL_P(obj); - if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { - break; + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - } else { - break; - } - } - - if (Z_TYPE_P(obj) != IS_OBJECT) { - break; - } - - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } break; - } + } break; } - } while (0); + } } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -22358,6 +22331,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -22400,6 +22374,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HA property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -22580,7 +22555,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -22768,7 +22743,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -22956,7 +22931,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -23144,7 +23119,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -24062,6 +24037,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER( } if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type) { @@ -24914,7 +24890,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && @@ -24951,43 +24927,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zval *obj = container; + /* TODO(krakjoe) deref container ... grrr */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + /* TODO(krakjoe) needs caching */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - do { - if (IS_VAR == IS_CONST || - (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { - if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { - obj = Z_REFVAL_P(obj); - if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { - break; + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - } else { - break; - } - } - - if (Z_TYPE_P(obj) != IS_OBJECT) { - break; - } - - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } break; - } + } break; } - } while (0); + } } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -25052,6 +25010,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -25094,6 +25053,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVA property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -25274,7 +25234,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -25462,7 +25422,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -25650,7 +25610,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -25838,7 +25798,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -26646,6 +26606,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR_HAND } if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type) { @@ -27393,7 +27354,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && @@ -27430,43 +27391,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zval *obj = container; + /* TODO(krakjoe) deref container ... grrr */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + /* TODO(krakjoe) needs caching */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - do { - if (IS_UNUSED == IS_CONST || - (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { - if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { - obj = Z_REFVAL_P(obj); - if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { - break; + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - } else { - break; - } + } break; } - - if (Z_TYPE_P(obj) != IS_OBJECT) { - break; - } - - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } break; - } - } - } while (0); + } } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -27603,6 +27546,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -27645,6 +27589,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CO property = EX_CONSTANT(opline->op2); if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -27825,7 +27770,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -28013,7 +27958,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -28201,7 +28146,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -28389,7 +28334,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -28996,6 +28941,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HA } if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type) { @@ -30840,7 +30786,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && @@ -30877,43 +30823,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zval *obj = container; + /* TODO(krakjoe) deref container ... grrr */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + /* TODO(krakjoe) needs caching */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - do { - if (IS_UNUSED == IS_CONST || - (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { - if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { - obj = Z_REFVAL_P(obj); - if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { - break; + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - } else { - break; - } - } - - if (Z_TYPE_P(obj) != IS_OBJECT) { - break; + } break; } - - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } break; - } - } - } while (0); + } } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -31050,6 +30978,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -31092,6 +31021,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -31272,7 +31202,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -31460,7 +31390,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -31648,7 +31578,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -31836,7 +31766,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -32317,6 +32247,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDL } if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type) { @@ -33229,7 +33160,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && @@ -33266,43 +33197,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zval *obj = container; + /* TODO(krakjoe) deref container ... grrr */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + /* TODO(krakjoe) needs caching */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - do { - if (IS_UNUSED == IS_CONST || - (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { - if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { - obj = Z_REFVAL_P(obj); - if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { - break; + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - } else { - break; - } + } break; } - - if (Z_TYPE_P(obj) != IS_OBJECT) { - break; - } - - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } break; - } - } - } while (0); + } } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -33440,6 +33353,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -33482,6 +33396,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TM property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -33662,7 +33577,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -33850,7 +33765,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -34038,7 +33953,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -34226,7 +34141,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -34709,6 +34624,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR_H } if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type) { @@ -38204,7 +38120,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && @@ -38241,43 +38157,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zval *obj = container; + /* TODO(krakjoe) deref container ... grrr */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + /* TODO(krakjoe) needs caching */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - do { - if (IS_CV == IS_CONST || - (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { - if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { - obj = Z_REFVAL_P(obj); - if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { - break; + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - } else { - break; - } - } - - if (Z_TYPE_P(obj) != IS_OBJECT) { - break; + } break; } - - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } break; - } - } - } while (0); + } } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -38414,6 +38312,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -38456,6 +38355,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_ property = EX_CONSTANT(opline->op2); if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -38680,7 +38580,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -38868,7 +38768,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -39056,7 +38956,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -39244,7 +39144,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -40269,6 +40169,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLE } if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type) { @@ -44714,7 +44615,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && @@ -44751,43 +44652,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zval *obj = container; + /* TODO(krakjoe) deref container ... grrr */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + /* TODO(krakjoe) needs caching */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - do { - if (IS_CV == IS_CONST || - (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { - if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { - obj = Z_REFVAL_P(obj); - if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { - break; + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - } else { - break; - } - } - - if (Z_TYPE_P(obj) != IS_OBJECT) { - break; - } - - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } break; - } + } break; } - } while (0); + } } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -44924,6 +44807,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -44966,6 +44850,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HAN property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -45146,7 +45031,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -45334,7 +45219,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -45522,7 +45407,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -45710,7 +45595,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -46731,6 +46616,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(Z } if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type) { @@ -48394,7 +48280,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && @@ -48431,43 +48317,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - zval *obj = container; + /* TODO(krakjoe) deref container ... grrr */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + /* TODO(krakjoe) needs caching */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - do { - if (IS_CV == IS_CONST || - (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { - if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) { - obj = Z_REFVAL_P(obj); - if (UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { - break; + if (prop_info && prop_info->type) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - } else { - break; - } - } - - if (Z_TYPE_P(obj) != IS_OBJECT) { - break; - } - - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(obj)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(obj)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } break; - } + } break; } - } while (0); + } } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -48605,6 +48473,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -48647,6 +48516,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { @@ -48827,7 +48697,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -49015,7 +48885,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -49203,7 +49073,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -49391,7 +49261,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs a cache slot */ + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { @@ -50304,6 +50174,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMPVAR_HANDL } if (Z_TYPE_P(offset) == IS_STRING) { + /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type) { From abdde6e2ef1e99a3552a4b242988214a3c7e033d Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 8 Mar 2016 17:31:19 +0000 Subject: [PATCH 044/369] betterness --- Zend/zend_execute.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index ebed2d7efd73..033eebf42369 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -782,7 +782,7 @@ zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, zend_class_entry *pce = type_ce ? *type_ce : NULL; zend_string *resolved = runtime ? zend_resolve_property_type(type_name, scope) : type_name; - if (!pce) { + if (!pce && runtime) { pce = zend_lookup_class(resolved); if (type_ce) { @@ -790,7 +790,7 @@ zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, } } - if (Z_TYPE_P(property) != IS_OBJECT || !instanceof_function(pce, Z_OBJCE_P(property))) { + if (Z_TYPE_P(property) != IS_OBJECT || !runtime || !instanceof_function(pce, Z_OBJCE_P(property))) { if (runtime) { zend_throw_exception_ex(zend_ce_type_error, type, "Typed property %s::$%s must be an instance of %s, %s used", From 7d121581bbb7aef6864ffd3c1d9dcb2a0d995618 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 05:10:22 +0000 Subject: [PATCH 045/369] restrict declaration groups --- .../type_declarations/typed_properties_018.phpt | 16 ++++++++++++++++ Zend/zend_compile.c | 8 +++++++- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_018.phpt 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 000000000000..621e17650758 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_018.phpt @@ -0,0 +1,16 @@ +--TEST-- +Test typed no mixing typed and untyped declarations +--FILE-- + +--EXPECTF-- +Fatal error: Property Foo::$qux is missing type information in %s on line 3 + + + + + diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 973a850be65b..0803ab13a5a1 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5304,6 +5304,7 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ uint32_t flags = list->attr; zend_class_entry *ce = CG(active_class_entry); uint32_t i, children = list->children; + zend_bool use_optional_types = 0; if (ce->ce_flags & ZEND_ACC_INTERFACE) { zend_error_noreturn(E_COMPILE_ERROR, "Interfaces may not include member variables"); @@ -5326,7 +5327,7 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ zend_string *optional_type_name = NULL; if (type_ast) { - + use_optional_types = 1; if (type_ast->kind == ZEND_AST_TYPE) { optional_type = type_ast->attr; } else { @@ -5363,6 +5364,11 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ optional_type_name = class_name; } } + } else if (use_optional_types) { + zend_error_noreturn(E_COMPILE_ERROR, + "Property %s::$%s is missing type information", + ZSTR_VAL(ce->name), + ZSTR_VAL(name)); } /* Doc comment has been appended as last element in ZEND_AST_PROP_ELEM ast */ From 2c3e242f56775e222866a38ac7b82897460a10e4 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 05:23:21 +0000 Subject: [PATCH 046/369] comments --- Zend/zend_vm_def.h | 4 +++- Zend/zend_vm_execute.h | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 87ebb3e00cad..bf5c7a49b696 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1863,7 +1863,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): if (Z_TYPE_P(offset) == IS_STRING) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - + if (prop_info && prop_info->type && Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -1899,6 +1899,8 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) } /* TODO(krakjoe) deref container ... grrr */ + /* we require a deref'd var here, but fetch does not */ + /* do we have to unconditionally deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 9db51b649a8a..8905c98a6766 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17765,6 +17765,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN } /* TODO(krakjoe) deref container ... grrr */ + /* we require a deref'd var here, but fetch does not */ + /* do we have to unconditionally deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { @@ -22249,6 +22251,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE } /* TODO(krakjoe) deref container ... grrr */ + /* we require a deref'd var here, but fetch does not */ + /* do we have to unconditionally deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { @@ -24928,6 +24932,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA } /* TODO(krakjoe) deref container ... grrr */ + /* we require a deref'd var here, but fetch does not */ + /* do we have to unconditionally deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { @@ -27392,6 +27398,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ } /* TODO(krakjoe) deref container ... grrr */ + /* we require a deref'd var here, but fetch does not */ + /* do we have to unconditionally deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { @@ -30824,6 +30832,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN } /* TODO(krakjoe) deref container ... grrr */ + /* we require a deref'd var here, but fetch does not */ + /* do we have to unconditionally deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { @@ -33198,6 +33208,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR } /* TODO(krakjoe) deref container ... grrr */ + /* we require a deref'd var here, but fetch does not */ + /* do we have to unconditionally deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { @@ -38158,6 +38170,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND } /* TODO(krakjoe) deref container ... grrr */ + /* we require a deref'd var here, but fetch does not */ + /* do we have to unconditionally deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { @@ -44653,6 +44667,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER } /* TODO(krakjoe) deref container ... grrr */ + /* we require a deref'd var here, but fetch does not */ + /* do we have to unconditionally deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { @@ -48318,6 +48334,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN } /* TODO(krakjoe) deref container ... grrr */ + /* we require a deref'd var here, but fetch does not */ + /* do we have to unconditionally deref container ? */ if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { switch ((EX(opline) + 1)->opcode) { From e5afe080c7caa611b28aa09964c86e77fa045872 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 05:32:56 +0000 Subject: [PATCH 047/369] nulling these seems like a good idea --- Zend/zend_inheritance.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index fcf5861be056..ea66986e5c6b 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -43,6 +43,7 @@ static zend_property_info *zend_duplicate_property_info(zend_property_info *prop } if (new_property_info->type_name) { zend_string_addref(new_property_info->type_name); + new_property_info->type_ce = NULL; } return new_property_info; @@ -56,6 +57,7 @@ static zend_property_info *zend_duplicate_property_info_internal(zend_property_i zend_string_addref(new_property_info->name); if (new_property_info->type_name) { zend_string_addref(new_property_info->type_name); + new_property_info->type_ce = NULL; } return new_property_info; From fb1ef8ab3c4bb3bbfd7003b93cd47ba5952f62ec Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 05:43:55 +0000 Subject: [PATCH 048/369] use flags here --- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index bf5c7a49b696..b4d03dd211a8 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2098,7 +2098,7 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) property = GET_OP2_ZVAL_PTR(BP_VAR_R); - if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 8905c98a6766..b9c9a7170f1a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17891,7 +17891,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST property = EX_CONSTANT(opline->op2); - if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -22377,7 +22377,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HA property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -25058,7 +25058,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVA property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -27596,7 +27596,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CO property = EX_CONSTANT(opline->op2); - if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -31030,7 +31030,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -33407,7 +33407,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TM property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -38368,7 +38368,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_ property = EX_CONSTANT(opline->op2); - if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -44865,7 +44865,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HAN property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -48533,7 +48533,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (Z_TYPE_P(container) == IS_OBJECT && Z_TYPE_P(property) == IS_STRING) { + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); From b4ec5eb9f23899c20cc88262570d3cbfd4dc5c8c Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 05:48:49 +0000 Subject: [PATCH 049/369] use flags here too --- Zend/zend_vm_def.h | 4 ++-- Zend/zend_vm_execute.h | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b4d03dd211a8..d74f84afc9fa 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -5929,7 +5929,7 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) } } - if (Z_TYPE_P(offset) == IS_STRING) { + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -6118,7 +6118,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) FREE_OP1_VAR_PTR(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) { + if (UNEXPECTED(Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index b9c9a7170f1a..081c00938e01 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -19581,7 +19581,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDL } } - if (Z_TYPE_P(offset) == IS_STRING) { + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -24040,7 +24040,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER( } } - if (Z_TYPE_P(offset) == IS_STRING) { + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -26611,7 +26611,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR_HAND } } - if (Z_TYPE_P(offset) == IS_STRING) { + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -28948,7 +28948,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HA } } - if (Z_TYPE_P(offset) == IS_STRING) { + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -32256,7 +32256,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDL } } - if (Z_TYPE_P(offset) == IS_STRING) { + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -34635,7 +34635,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR_H } } - if (Z_TYPE_P(offset) == IS_STRING) { + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -40182,7 +40182,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLE } } - if (Z_TYPE_P(offset) == IS_STRING) { + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -46631,7 +46631,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(Z } } - if (Z_TYPE_P(offset) == IS_STRING) { + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); @@ -50191,7 +50191,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMPVAR_HANDL } } - if (Z_TYPE_P(offset) == IS_STRING) { + if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); From 90e18dbad4193905211dbd2640b11e369e956250 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 06:12:38 +0000 Subject: [PATCH 050/369] test widening, fix uninitialized access check --- .../typed_properties_019.phpt | 21 ++++++++++ Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 38 +++++++++---------- 3 files changed, 41 insertions(+), 20 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_019.phpt 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 000000000000..906ea1cf9d08 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_019.phpt @@ -0,0 +1,21 @@ +--TEST-- +Test typed int must be allowed to widen to float +--FILE-- +bar = 2.2; + +var_dump($foo->bar); +?> +--EXPECT-- +float(2.2) + + + + + diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d74f84afc9fa..aff7c2c16735 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1865,7 +1865,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 081c00938e01..8eb66725448d 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4263,7 +4263,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) { + if (UNEXPECTED(Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -5620,7 +5620,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), @@ -9401,7 +9401,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), @@ -11234,7 +11234,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), @@ -12677,7 +12677,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_TMP_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) { + if (UNEXPECTED(Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -13188,7 +13188,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), @@ -14445,7 +14445,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), @@ -15003,7 +15003,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), @@ -16275,7 +16275,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) { + if (UNEXPECTED(Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -17731,7 +17731,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), @@ -22217,7 +22217,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), @@ -24898,7 +24898,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), @@ -27364,7 +27364,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), @@ -30798,7 +30798,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), @@ -33174,7 +33174,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), @@ -36216,7 +36216,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) { + if (UNEXPECTED(Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -38136,7 +38136,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), @@ -44633,7 +44633,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), @@ -48300,7 +48300,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) != prop_info->type) { + Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(Z_OBJCE_P(container)->name), From 17f749eaff4a21effaf54de07d63a3a44b3994f5 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 06:20:11 +0000 Subject: [PATCH 051/369] description corrections --- Zend/tests/type_declarations/typed_properties_009.phpt | 2 +- Zend/tests/type_declarations/typed_properties_010.phpt | 2 +- Zend/tests/type_declarations/typed_properties_011.phpt | 2 +- Zend/tests/type_declarations/typed_properties_012.phpt | 2 +- Zend/tests/type_declarations/typed_properties_013.phpt | 2 +- Zend/tests/type_declarations/typed_properties_014.phpt | 2 +- Zend/tests/type_declarations/typed_properties_015.phpt | 2 +- Zend/tests/type_declarations/typed_properties_016.phpt | 2 +- Zend/tests/type_declarations/typed_properties_017.phpt | 2 +- Zend/tests/type_declarations/typed_properties_018.phpt | 2 +- Zend/tests/type_declarations/typed_properties_019.phpt | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_009.phpt b/Zend/tests/type_declarations/typed_properties_009.phpt index caa435a02c2e..5d749522d6f5 100644 --- a/Zend/tests/type_declarations/typed_properties_009.phpt +++ b/Zend/tests/type_declarations/typed_properties_009.phpt @@ -1,5 +1,5 @@ --TEST-- -Test typed disallow unset +Test typed properties disallow unset --FILE-- Date: Wed, 9 Mar 2016 06:24:02 +0000 Subject: [PATCH 052/369] can never be an object at compile time --- Zend/zend_execute.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 033eebf42369..ac0f4a68440d 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -806,9 +806,7 @@ zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, ZSTR_VAL(scope->name), ZSTR_VAL(name), ZSTR_VAL(resolved), - Z_TYPE_P(property) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(property)->name) : - zend_get_type_by_const(Z_TYPE_P(property))); + zend_get_type_by_const(Z_TYPE_P(property))); } return 0; } @@ -836,9 +834,7 @@ zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, ZSTR_VAL(scope->name), ZSTR_VAL(name), zend_get_type_by_const(type), - Z_TYPE_P(property) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(property)->name) : - zend_get_type_by_const(Z_TYPE_P(property))); + zend_get_type_by_const(Z_TYPE_P(property))); } return 0; } From c7306b55ae046852b35623b68f0dc13824721c29 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 10:36:25 +0000 Subject: [PATCH 053/369] more verify in fetch_obj_r --- Zend/zend_vm_def.h | 17 +-- Zend/zend_vm_execute.h | 255 ++++++++++++++++++++++++----------------- 2 files changed, 160 insertions(+), 112 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index aff7c2c16735..797aef8456f5 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1864,13 +1864,16 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + HANDLE_EXCEPTION(); + } } } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 8eb66725448d..0b1a65fc59aa 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5619,13 +5619,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + HANDLE_EXCEPTION(); + } } } } @@ -9400,13 +9403,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + HANDLE_EXCEPTION(); + } } } } @@ -11233,13 +11239,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + HANDLE_EXCEPTION(); + } } } } @@ -13187,13 +13196,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + HANDLE_EXCEPTION(); + } } } } @@ -14444,13 +14456,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + HANDLE_EXCEPTION(); + } } } } @@ -15002,13 +15017,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + HANDLE_EXCEPTION(); + } } } } @@ -17730,13 +17748,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + HANDLE_EXCEPTION(); + } } } } @@ -22216,13 +22237,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + HANDLE_EXCEPTION(); + } } } } @@ -24897,13 +24921,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + HANDLE_EXCEPTION(); + } } } } @@ -27363,13 +27390,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + HANDLE_EXCEPTION(); + } } } } @@ -30797,13 +30827,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + HANDLE_EXCEPTION(); + } } } } @@ -33173,13 +33206,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + HANDLE_EXCEPTION(); + } } } } @@ -38135,13 +38171,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + HANDLE_EXCEPTION(); + } } } } @@ -44632,13 +44671,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + HANDLE_EXCEPTION(); + } } } } @@ -48299,13 +48341,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - if (prop_info && prop_info->type && - Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(Z_OBJCE_P(container)->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + HANDLE_EXCEPTION(); + } } } } From 1fa810605808929088a9826ba68d24184b8f98bb Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 10:49:12 +0000 Subject: [PATCH 054/369] add tests for obj_read_r coerced value --- .../typed_properties_020.phpt | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_020.phpt 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 000000000000..c73b3bebff48 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_020.phpt @@ -0,0 +1,29 @@ +--TEST-- +Test typed properties do not allow coerced values to be used +--FILE-- +bar += 1; + + var_dump($this->bar); + } +} + +$foo = new Foo(); + +var_dump($foo->bar); +?> +--EXPECTF-- +Fatal error: Uncaught TypeError: Typed property Foo::$bar must be string, integer used in %s:8 +Stack trace: +#0 %s(12): Foo->__construct() +#1 {main} + thrown in %s on line 8 + + + + + From b9f8e85c46524977d3a68aec55d080a3c5178081 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 11:07:58 +0000 Subject: [PATCH 055/369] fix binary assign helper --- .../typed_properties_020.phpt | 7 +- Zend/zend_vm_def.h | 10 +++ Zend/zend_vm_execute.h | 90 +++++++++++++++++++ 3 files changed, 103 insertions(+), 4 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt index c73b3bebff48..856a4fce86bc 100644 --- a/Zend/tests/type_declarations/typed_properties_020.phpt +++ b/Zend/tests/type_declarations/typed_properties_020.phpt @@ -7,8 +7,6 @@ class Foo { public function __construct() { $this->bar += 1; - - var_dump($this->bar); } } @@ -17,11 +15,12 @@ $foo = new Foo(); var_dump($foo->bar); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Foo::$bar must be string, integer used in %s:8 +Fatal error: Uncaught TypeError: Typed property Foo::$bar must be string, integer used in %s:6 Stack trace: #0 %s(12): Foo->__construct() #1 {main} - thrown in %s on line 8 + thrown in %s on line 6 + diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 797aef8456f5..4503a65347f6 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -734,6 +734,16 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } } + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); + } + } + } + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 0b1a65fc59aa..f0e0d7bd12c6 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17090,6 +17090,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); + } + } + } + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -21579,6 +21589,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); + } + } + } + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -24259,6 +24279,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); + } + } + } + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -26853,6 +26883,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); + } + } + } + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -30290,6 +30330,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); + } + } + } + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -32666,6 +32716,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); + } + } + } + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -37346,6 +37406,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); + } + } + } + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -43985,6 +44055,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); + } + } + } + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -47651,6 +47731,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + HANDLE_EXCEPTION(); + } + } + } + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { From 8dbdbf9ff6a38e55bbb9da520967c5c14d515da5 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 11:23:21 +0000 Subject: [PATCH 056/369] woops --- Zend/tests/type_declarations/typed_properties_020.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt index 856a4fce86bc..131412b21a21 100644 --- a/Zend/tests/type_declarations/typed_properties_020.phpt +++ b/Zend/tests/type_declarations/typed_properties_020.phpt @@ -17,7 +17,7 @@ var_dump($foo->bar); --EXPECTF-- Fatal error: Uncaught TypeError: Typed property Foo::$bar must be string, integer used in %s:6 Stack trace: -#0 %s(12): Foo->__construct() +#0 %s(10): Foo->__construct() #1 {main} thrown in %s on line 6 From 4e8988a45146d60ff2a8e9a1b284e63fdc11d752 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 12:46:27 +0000 Subject: [PATCH 057/369] update test desc --- Zend/tests/type_declarations/typed_properties_020.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt index 131412b21a21..fc1d6e13930f 100644 --- a/Zend/tests/type_declarations/typed_properties_020.phpt +++ b/Zend/tests/type_declarations/typed_properties_020.phpt @@ -1,5 +1,5 @@ --TEST-- -Test typed properties do not allow coerced values to be used +Test typed properties binary assign op helper test --FILE-- Date: Wed, 9 Mar 2016 13:12:43 +0000 Subject: [PATCH 058/369] delay check for constant/ast during compile --- Zend/zend_API.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 0bdc3706a741..6fa31e1a9684 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3630,8 +3630,14 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name type_name = ce->name; } - if (!zend_verify_property_type(ce, name, optional_type, type_name, NULL, property, 0)) { - return FAILURE; + switch (Z_TYPE_P(property)) { + case IS_CONSTANT: + case IS_CONSTANT_AST: + break; + + default: if (!zend_verify_property_type(ce, name, optional_type, type_name, NULL, property, 0)) { + return FAILURE; + } } } } From 373b2a5e19790d53ddb73ddbe34061551f51ef95 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 13:14:10 +0000 Subject: [PATCH 059/369] add test for that^ --- .../typed_properties_021.phpt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_021.phpt 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 000000000000..dcd21c9adc3e --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_021.phpt @@ -0,0 +1,20 @@ +--TEST-- +Test typed properties delay type check on constant/ast +--FILE-- +bar); +?> +--EXPECTF-- +Fatal error: Class 'BAR' not found in %s on line 6 + + + + + + From d2ab6d2aa0d54b7161067213554ae77fd488d76b Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 13:16:00 +0000 Subject: [PATCH 060/369] moar tests --- .../typed_properties_021.phpt | 2 +- .../typed_properties_022.phpt | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_022.phpt diff --git a/Zend/tests/type_declarations/typed_properties_021.phpt b/Zend/tests/type_declarations/typed_properties_021.phpt index dcd21c9adc3e..b3e3fa088724 100644 --- a/Zend/tests/type_declarations/typed_properties_021.phpt +++ b/Zend/tests/type_declarations/typed_properties_021.phpt @@ -1,5 +1,5 @@ --TEST-- -Test typed properties delay type check on constant/ast +Test typed properties delay type check on constant --FILE-- bar); +?> +--EXPECTF-- +Fatal error: Class 'BAR' not found in %s on line 6 + + + + + + From fa835f34936c4bfae2891b50d94a86a44f9122a5 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 13:19:18 +0000 Subject: [PATCH 061/369] refactor switch --- Zend/zend_API.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 6fa31e1a9684..5dea8f17934e 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3623,19 +3623,20 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name } if (optional_type) { - if (Z_TYPE_P(property) != IS_UNDEF) { - zend_string *type_name = optional_type_name; + switch (Z_TYPE_P(property)) { + case IS_UNDEF: + case IS_CONSTANT: + case IS_CONSTANT_AST: + break; - if (type_name && zend_string_equals_literal_ci(type_name, "self")) { - type_name = ce->name; - } + default: { + zend_string *type_name = optional_type_name; - switch (Z_TYPE_P(property)) { - case IS_CONSTANT: - case IS_CONSTANT_AST: - break; + if (type_name && zend_string_equals_literal_ci(type_name, "self")) { + type_name = ce->name; + } - default: if (!zend_verify_property_type(ce, name, optional_type, type_name, NULL, property, 0)) { + if (!zend_verify_property_type(ce, name, optional_type, type_name, NULL, property, 0)) { return FAILURE; } } From 1d8a9d7e38f54de99fcf568f6dd741e626a99e8d Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 13:21:20 +0000 Subject: [PATCH 062/369] squish branches --- Zend/zend_API.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 5dea8f17934e..1cc7fda8bb62 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3624,7 +3624,7 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name if (optional_type) { switch (Z_TYPE_P(property)) { - case IS_UNDEF: + case IS_UNDEF: case IS_CONSTANT: case IS_CONSTANT_AST: break; @@ -3641,6 +3641,7 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name } } } + ce->ce_flags |= ZEND_ACC_HAS_TYPE_HINTS; } if (Z_ISUNDEF_P(property)) { @@ -3708,10 +3709,6 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name zend_hash_update_ptr(&ce->properties_info, name, property_info); - if (property_info->type) { - ce->ce_flags |= ZEND_ACC_HAS_TYPE_HINTS; - } - return SUCCESS; } /* }}} */ From fb4f14f4cbe9d8442bbd24a0b9928c17c00975c2 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 14:31:23 +0000 Subject: [PATCH 063/369] disallow typed static properties, throw core errors for internal class stuff --- .../typed_properties_023.phpt | 21 +++++++++++++ Zend/zend_API.c | 30 ++++++++++++------- Zend/zend_compile.c | 7 +++++ Zend/zend_execute.c | 4 +-- 4 files changed, 49 insertions(+), 13 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_023.phpt 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 000000000000..b99eef98f20e --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_023.phpt @@ -0,0 +1,21 @@ +--TEST-- +Test typed properties disallow static +--FILE-- +bar); +?> +--EXPECTF-- +Fatal error: Typed property Foo::$thing must not be static in %s on line 3 + + + + + + + diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 1cc7fda8bb62..d687fb598daf 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3610,19 +3610,15 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name { zend_property_info *property_info, *property_info_ptr; - if (ce->type == ZEND_INTERNAL_CLASS) { - property_info = pemalloc(sizeof(zend_property_info), 1); - if ((access_type & ZEND_ACC_STATIC) || Z_CONSTANT_P(property)) { - ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; - } - } else { - property_info = zend_arena_alloc(&CG(arena), sizeof(zend_property_info)); - if (Z_CONSTANT_P(property)) { - ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; + if (optional_type) { + if (access_type & ZEND_ACC_STATIC) { + zend_error(ce->type == ZEND_USER_CLASS ? E_COMPILE_ERROR : E_CORE_ERROR, + "Typed property %s::$%s must not be static", + ZSTR_VAL(ce->name), + ZSTR_VAL(name)); + return FAILURE; } - } - if (optional_type) { switch (Z_TYPE_P(property)) { case IS_UNDEF: case IS_CONSTANT: @@ -3644,6 +3640,18 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name ce->ce_flags |= ZEND_ACC_HAS_TYPE_HINTS; } + if (ce->type == ZEND_INTERNAL_CLASS) { + property_info = pemalloc(sizeof(zend_property_info), 1); + if ((access_type & ZEND_ACC_STATIC) || Z_CONSTANT_P(property)) { + ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; + } + } else { + property_info = zend_arena_alloc(&CG(arena), sizeof(zend_property_info)); + if (Z_CONSTANT_P(property)) { + ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; + } + } + if (Z_ISUNDEF_P(property)) { ZVAL_NULL(property); } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 0803ab13a5a1..a72909e263e3 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5327,6 +5327,13 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ zend_string *optional_type_name = NULL; if (type_ast) { + if (flags & ZEND_ACC_STATIC) { + zend_error_noreturn(ce->type == ZEND_USER_CLASS ? E_COMPILE_ERROR : E_CORE_ERROR, + "Typed property %s::$%s must not be static", + ZSTR_VAL(ce->name), + ZSTR_VAL(name)); + } + use_optional_types = 1; if (type_ast->kind == ZEND_AST_TYPE) { optional_type = type_ast->attr; diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index ac0f4a68440d..d0715904e985 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -801,7 +801,7 @@ zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, ZSTR_VAL(Z_OBJCE_P(property)->name) : zend_get_type_by_const(Z_TYPE_P(property))); } else { - zend_error(E_COMPILE_ERROR, + zend_error(scope->type == ZEND_USER_CLASS ? E_COMPILE_ERROR : E_CORE_ERROR, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(scope->name), ZSTR_VAL(name), @@ -829,7 +829,7 @@ zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, ZSTR_VAL(Z_OBJCE_P(property)->name) : zend_get_type_by_const(Z_TYPE_P(property))); } else { - zend_error(E_COMPILE_ERROR, + zend_error(scope->type == ZEND_USER_CLASS ? E_COMPILE_ERROR : E_CORE_ERROR, "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(scope->name), ZSTR_VAL(name), From 5817fa33b38cd6ba009ed5a72a0be8f2f8504399 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 14:34:01 +0000 Subject: [PATCH 064/369] makes no sense --- Zend/zend_compile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index a72909e263e3..f212097c47b6 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5328,7 +5328,7 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ if (type_ast) { if (flags & ZEND_ACC_STATIC) { - zend_error_noreturn(ce->type == ZEND_USER_CLASS ? E_COMPILE_ERROR : E_CORE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "Typed property %s::$%s must not be static", ZSTR_VAL(ce->name), ZSTR_VAL(name)); From d195bce89e1171c01efbf2c1328d581694b9ebcc Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 9 Mar 2016 17:18:19 +0000 Subject: [PATCH 065/369] add tests for inheritance of private props --- .../typed_properties_024.phpt | 21 +++++++++++++++++++ Zend/zend_inheritance.c | 2 +- Zend/zend_vm_def.h | 3 +++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_024.phpt 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 000000000000..d38fe249534b --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_024.phpt @@ -0,0 +1,21 @@ +--TEST-- +Test typed properties ignore private props during inheritance +--FILE-- + +--EXPECT-- +ok + + + + + + + diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index ea66986e5c6b..c5d1eeb3e37f 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -699,7 +699,7 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke } } } else { - if (UNEXPECTED(parent_info->type)) { + if (UNEXPECTED(parent_info->type && !(parent_info->flags & ZEND_ACC_PRIVATE))) { if (parent_info->type == IS_OBJECT) { zend_error_noreturn(E_COMPILE_ERROR, "Type of %s::$%s must be %s (as in class %s)", diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 4503a65347f6..5e86b161275b 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2570,6 +2570,9 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) #else if (UNEXPECTED(EG(exception) != NULL) && (call_info & ZEND_CALL_CTOR)) { #endif + if (Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) { + + } GC_REFCOUNT(object)--; if (GC_REFCOUNT(object) == 1) { zend_object_store_ctor_failed(object); From 2beab02338aab8f2aab07c113d7209385231362d Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Thu, 10 Mar 2016 06:10:07 +0000 Subject: [PATCH 066/369] export type from ast ... note that there are still outstanding bugs in AST exporter not connected to this RFC --- Zend/zend_ast.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 64df7e95f862..3b9356461b98 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -1437,7 +1437,11 @@ static void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int } break; case ZEND_AST_PROP_ELEM: - /* TODO(krakjoe) export type */ + if (ast->child[0]) { + zend_ast_export_name( + str, ast->child[0], 0, indent); + smart_str_appendc(str, ' '); + } smart_str_appendc(str, '$'); zend_ast_export_name(str, ast->child[1], 0, indent); APPEND_DEFAULT_VALUE(2); From 109ee15364333374635d9eb1a33a2838c6833971 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Thu, 10 Mar 2016 06:25:21 +0000 Subject: [PATCH 067/369] cleanup tests --- Zend/tests/type_declarations/typed_properties_020.phpt | 2 -- Zend/tests/type_declarations/typed_properties_021.phpt | 2 -- Zend/tests/type_declarations/typed_properties_022.phpt | 2 -- Zend/tests/type_declarations/typed_properties_023.phpt | 4 ---- 4 files changed, 10 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt index fc1d6e13930f..78a7bf4e4ade 100644 --- a/Zend/tests/type_declarations/typed_properties_020.phpt +++ b/Zend/tests/type_declarations/typed_properties_020.phpt @@ -11,8 +11,6 @@ class Foo { } $foo = new Foo(); - -var_dump($foo->bar); ?> --EXPECTF-- Fatal error: Uncaught TypeError: Typed property Foo::$bar must be string, integer used in %s:6 diff --git a/Zend/tests/type_declarations/typed_properties_021.phpt b/Zend/tests/type_declarations/typed_properties_021.phpt index b3e3fa088724..79a5d70098e4 100644 --- a/Zend/tests/type_declarations/typed_properties_021.phpt +++ b/Zend/tests/type_declarations/typed_properties_021.phpt @@ -7,8 +7,6 @@ class Foo { } $foo = new Foo(); - -var_dump($foo->bar); ?> --EXPECTF-- Fatal error: Class 'BAR' not found in %s on line 6 diff --git a/Zend/tests/type_declarations/typed_properties_022.phpt b/Zend/tests/type_declarations/typed_properties_022.phpt index 4b62012359f6..1aa23f301fdf 100644 --- a/Zend/tests/type_declarations/typed_properties_022.phpt +++ b/Zend/tests/type_declarations/typed_properties_022.phpt @@ -7,8 +7,6 @@ class Foo { } $foo = new Foo(); - -var_dump($foo->bar); ?> --EXPECTF-- Fatal error: Class 'BAR' not found in %s on line 6 diff --git a/Zend/tests/type_declarations/typed_properties_023.phpt b/Zend/tests/type_declarations/typed_properties_023.phpt index b99eef98f20e..ce6aa53c1387 100644 --- a/Zend/tests/type_declarations/typed_properties_023.phpt +++ b/Zend/tests/type_declarations/typed_properties_023.phpt @@ -5,10 +5,6 @@ Test typed properties disallow static class Foo { public static int $thing; } - -$foo = new Foo(); - -var_dump($foo->bar); ?> --EXPECTF-- Fatal error: Typed property Foo::$thing must not be static in %s on line 3 From 86ea6ed1e5931b227a931828cafc7fbcc81dba6b Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Thu, 10 Mar 2016 06:48:31 +0000 Subject: [PATCH 068/369] fix func arg fetch handler --- Zend/zend_vm_def.h | 6 ++---- Zend/zend_vm_execute.h | 45 ++++++++++++++++++++++++++++-------------- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 5e86b161275b..c8b5b9b6fef3 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2067,7 +2067,8 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + /* TODO(krakjoe) deref container problem again */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -2570,9 +2571,6 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) #else if (UNEXPECTED(EG(exception) != NULL) && (call_info & ZEND_CALL_CTOR)) { #endif - if (Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) { - - } GC_REFCOUNT(object)--; if (GC_REFCOUNT(object) == 1) { zend_object_store_ctor_failed(object); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index f0e0d7bd12c6..f03a94eb9a69 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5737,7 +5737,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + /* TODO(krakjoe) deref container problem again */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -9521,7 +9522,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + /* TODO(krakjoe) deref container problem again */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -11358,7 +11360,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + /* TODO(krakjoe) deref container problem again */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -13242,7 +13245,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + /* TODO(krakjoe) deref container problem again */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -14502,7 +14506,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + /* TODO(krakjoe) deref container problem again */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -15063,7 +15068,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + /* TODO(krakjoe) deref container problem again */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -17878,7 +17884,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + /* TODO(krakjoe) deref container problem again */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -22377,7 +22384,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + /* TODO(krakjoe) deref container problem again */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -25071,7 +25079,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + /* TODO(krakjoe) deref container problem again */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -27622,7 +27631,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + /* TODO(krakjoe) deref container problem again */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -31069,7 +31079,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + /* TODO(krakjoe) deref container problem again */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -33459,7 +33470,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + /* TODO(krakjoe) deref container problem again */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -38433,7 +38445,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + /* TODO(krakjoe) deref container problem again */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -44943,7 +44956,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + /* TODO(krakjoe) deref container problem again */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); @@ -48624,7 +48638,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP HANDLE_EXCEPTION(); } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + /* TODO(krakjoe) deref container problem again */ + if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { if (Z_TYPE_P(property) == IS_STRING) { /* TODO(krakjoe) needs caching */ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); From 9a8fb9ee00b85f3ed160798f36998b5c5b629a39 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Thu, 10 Mar 2016 08:04:18 +0000 Subject: [PATCH 069/369] fix mixing typed and untyped properties, add another test for that --- .../type_declarations/typed_properties_018.phpt | 2 +- .../type_declarations/typed_properties_025.phpt | 16 ++++++++++++++++ Zend/zend_compile.c | 9 ++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_025.phpt diff --git a/Zend/tests/type_declarations/typed_properties_018.phpt b/Zend/tests/type_declarations/typed_properties_018.phpt index c70245821f95..f60525536f38 100644 --- a/Zend/tests/type_declarations/typed_properties_018.phpt +++ b/Zend/tests/type_declarations/typed_properties_018.phpt @@ -8,7 +8,7 @@ class Foo { } ?> --EXPECTF-- -Fatal error: Property Foo::$qux is missing type information in %s on line 3 +Fatal error: Untyped property Foo::$qux must not be mixed with typed properties in %s on line 3 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 000000000000..7979a33898e6 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_025.phpt @@ -0,0 +1,16 @@ +--TEST-- +Test typed properties disallow mixing typed and untyped declarations +--FILE-- + +--EXPECTF-- +Fatal error: Typed property Foo::$qux must not be mixed with untyped properties in %s on line 3 + + + + + diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index f212097c47b6..e87c212e94c4 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5334,6 +5334,13 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ ZSTR_VAL(name)); } + if (!use_optional_types && i > 0) { + zend_error_noreturn(E_COMPILE_ERROR, + "Typed property %s::$%s must not be mixed with untyped properties", + ZSTR_VAL(ce->name), + ZSTR_VAL(name)); + } + use_optional_types = 1; if (type_ast->kind == ZEND_AST_TYPE) { optional_type = type_ast->attr; @@ -5373,7 +5380,7 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ } } else if (use_optional_types) { zend_error_noreturn(E_COMPILE_ERROR, - "Property %s::$%s is missing type information", + "Untyped property %s::$%s must not be mixed with typed properties", ZSTR_VAL(ce->name), ZSTR_VAL(name)); } From 0d5d80138d1e13cbad0bd08558b0d82dbe6b58f3 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Fri, 11 Mar 2016 06:22:56 +0000 Subject: [PATCH 070/369] reflection changes --- ext/reflection/php_reflection.c | 119 ++++++++++++++++--- ext/reflection/tests/ReflectionType_001.phpt | 29 +++++ 2 files changed, 129 insertions(+), 19 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 68aa136d90de..904844ed0e26 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -203,10 +203,19 @@ typedef struct _parameter_reference { zend_function *fptr; } parameter_reference; +typedef enum { + REF_INFO_ARG, + REF_INFO_PROP +} reflection_info_type_t; + /* Struct for type hints */ typedef struct _type_reference { - struct _zend_arg_info *arg_info; - zend_function *fptr; + reflection_info_type_t type; + union { + zend_function *fptr; + zend_class_entry *ce; + } scope; + void *info; } type_reference; typedef enum { @@ -320,7 +329,9 @@ static void reflection_free_objects_storage(zend_object *object) /* {{{ */ break; case REF_TYPE_TYPE: typ_reference = (type_reference*)intern->ptr; - _free_function(typ_reference->fptr); + if (typ_reference->type == REF_INFO_ARG) { + _free_function(typ_reference->scope.fptr); + } efree(intern->ptr); break; case REF_TYPE_FUNCTION: @@ -1262,7 +1273,7 @@ static void reflection_parameter_factory(zend_function *fptr, zval *closure_obje /* }}} */ /* {{{ reflection_type_factory */ -static void reflection_type_factory(zend_function *fptr, zval *closure_object, struct _zend_arg_info *arg_info, zval *object) +static void reflection_type_factory(void *scope, zval *closure_object, void *info, reflection_info_type_t type, zval *object) { reflection_object *intern; type_reference *reference; @@ -1270,11 +1281,25 @@ static void reflection_type_factory(zend_function *fptr, zval *closure_object, s reflection_instantiate(reflection_type_ptr, object); intern = Z_REFLECTION_P(object); reference = (type_reference*) emalloc(sizeof(type_reference)); - reference->arg_info = arg_info; - reference->fptr = fptr; + reference->info = info; + reference->type = type; intern->ptr = reference; intern->ref_type = REF_TYPE_TYPE; - intern->ce = fptr->common.scope; + + switch (type) { + case REF_INFO_ARG: { + zend_function *fptr = (zend_function*) scope; + + reference->scope.fptr = fptr; + intern->ce = fptr->common.scope; + } break; + + case REF_INFO_PROP: + reference->scope.ce = scope; + intern->ce = scope; + break; + } + if (closure_object) { Z_ADDREF_P(closure_object); ZVAL_COPY_VALUE(&intern->obj, closure_object); @@ -2728,7 +2753,7 @@ ZEND_METHOD(reflection_parameter, getType) { RETURN_NULL(); } - reflection_type_factory(_copy_function(param->fptr), Z_ISUNDEF(intern->obj)? NULL : &intern->obj, param->arg_info, return_value); + reflection_type_factory(_copy_function(param->fptr), Z_ISUNDEF(intern->obj)? NULL : &intern->obj, param->arg_info, REF_INFO_ARG, return_value); } /* }}} */ @@ -2981,7 +3006,16 @@ ZEND_METHOD(reflection_type, allowsNull) } GET_REFLECTION_OBJECT_PTR(param); - RETVAL_BOOL(param->arg_info->allow_null); + switch (param->type) { + case REF_INFO_ARG: { + RETVAL_BOOL(((zend_arg_info*) param->info)->allow_null); + } break; + + + case REF_INFO_PROP: + RETVAL_FALSE; + break; + } } /* }}} */ @@ -2997,7 +3031,15 @@ ZEND_METHOD(reflection_type, isBuiltin) } GET_REFLECTION_OBJECT_PTR(param); - RETVAL_BOOL(param->arg_info->type_hint != IS_OBJECT); + switch (param->type) { + case REF_INFO_ARG: { + RETVAL_BOOL(((zend_arg_info*) param->info)->type_hint != IS_OBJECT); + } break; + + case REF_INFO_PROP: + RETVAL_BOOL(((zend_property_info*) param->info)->type != IS_OBJECT); + break; + } } /* }}} */ @@ -3007,21 +3049,38 @@ ZEND_METHOD(reflection_type, __toString) { reflection_object *intern; type_reference *param; - + zend_uchar type = IS_UNDEF; + if (zend_parse_parameters_none() == FAILURE) { return; } + GET_REFLECTION_OBJECT_PTR(param); - switch (param->arg_info->type_hint) { + switch (param->type) { + case REF_INFO_ARG: { + type = ((zend_arg_info*)param->info)->type_hint; + if (type == IS_OBJECT) { + zend_function *fptr = param->scope.fptr; + + if (fptr->type == ZEND_INTERNAL_FUNCTION && + !(fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO)) { + RETURN_STRING(((zend_internal_arg_info*) param->info)->class_name); + } else RETURN_STR_COPY(((zend_arg_info*)param->info)->class_name); + } + } break; + + case REF_INFO_PROP: { + type = ((zend_property_info*)param->info)->type; + if (type == IS_OBJECT) { + RETURN_STR_COPY(((zend_property_info*)param->info)->type_name); + } + } break; + } + + switch (type) { case IS_ARRAY: RETURN_STRINGL("array", sizeof("array") - 1); case IS_CALLABLE: RETURN_STRINGL("callable", sizeof("callable") - 1); - case IS_OBJECT: - if (param->fptr->type == ZEND_INTERNAL_FUNCTION && - !(param->fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO)) { - RETURN_STRING(((zend_internal_arg_info*)param->arg_info)->class_name); - } - RETURN_STR_COPY(param->arg_info->class_name); case IS_STRING: RETURN_STRINGL("string", sizeof("string") - 1); case _IS_BOOL: RETURN_STRINGL("bool", sizeof("bool") - 1); case IS_LONG: RETURN_STRINGL("int", sizeof("int") - 1); @@ -3574,7 +3633,7 @@ ZEND_METHOD(reflection_function, getReturnType) RETURN_NULL(); } - reflection_type_factory(_copy_function(fptr), Z_ISUNDEF(intern->obj)? NULL : &intern->obj, &fptr->common.arg_info[-1], return_value); + reflection_type_factory(_copy_function(fptr), Z_ISUNDEF(intern->obj)? NULL : &intern->obj, &fptr->common.arg_info[-1], REF_INFO_ARG, return_value); } /* }}} */ @@ -5799,6 +5858,27 @@ ZEND_METHOD(reflection_property, setAccessible) } /* }}} */ +/* {{{ proto public ReflectionType ReflectionProperty::getType() + Returns the type associated with the property */ +ZEND_METHOD(reflection_property, getType) +{ + reflection_object *intern; + property_reference *ref; + + if (zend_parse_parameters_none() == FAILURE) { + return; + } + + GET_REFLECTION_OBJECT_PTR(ref); + + if (!ref->prop.type) { + RETURN_NULL(); + } + + reflection_type_factory(ref->prop.ce, Z_ISUNDEF(intern->obj) ? NULL : &intern->obj, &ref->prop, REF_INFO_PROP, return_value); +} +/* }}} */ + /* {{{ proto public static mixed ReflectionExtension::export(string name [, bool return]) throws ReflectionException Exports a reflection object. Returns the output if TRUE is specified for return, printing it otherwise. */ ZEND_METHOD(reflection_extension, export) @@ -6668,6 +6748,7 @@ static const zend_function_entry reflection_property_functions[] = { ZEND_ME(reflection_property, getDeclaringClass, arginfo_reflection__void, 0) ZEND_ME(reflection_property, getDocComment, arginfo_reflection__void, 0) ZEND_ME(reflection_property, setAccessible, arginfo_reflection_property_setAccessible, 0) + ZEND_ME(reflection_property, getType, arginfo_reflection__void, 0) PHP_FE_END }; diff --git a/ext/reflection/tests/ReflectionType_001.phpt b/ext/reflection/tests/ReflectionType_001.phpt index f764cf1519d9..015525aa66e6 100644 --- a/ext/reflection/tests/ReflectionType_001.phpt +++ b/ext/reflection/tests/ReflectionType_001.phpt @@ -73,6 +73,26 @@ foreach ([ var_dump((string)$ra); } } + +echo "\n*** property types\n"; + +class PropTypeTest { + public int $int; + public string $string; + public array $arr; + public callable $callable; + public stdClass $std; + public OtherThing $other; +} + +$reflector = new ReflectionClass(PropTypeTest::class); + +foreach ($reflector->getProperties() as $name => $property) { + printf("public %s $%s;\n", + $property->getName(), (string) $property->getType()); +} + +echo "** property types\n"; --EXPECT-- *** functions ** Function 0 - Parameter 0 @@ -183,3 +203,12 @@ bool(true) bool(false) bool(false) string(4) "Test" + +*** property types +public int $int; +public string $string; +public arr $array; +public callable $callable; +public std $stdClass; +public other $OtherThing; +** property types From 29f80f3673fada9806f3516271c11a88896964fd Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Fri, 11 Mar 2016 06:27:03 +0000 Subject: [PATCH 071/369] the same changes, but nicer --- ext/reflection/php_reflection.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 904844ed0e26..b92bfdedc44b 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -215,7 +215,10 @@ typedef struct _type_reference { zend_function *fptr; zend_class_entry *ce; } scope; - void *info; + union { + zend_arg_info *arg; + zend_property_info *prop; + } info; } type_reference; typedef enum { @@ -1281,7 +1284,6 @@ static void reflection_type_factory(void *scope, zval *closure_object, void *inf reflection_instantiate(reflection_type_ptr, object); intern = Z_REFLECTION_P(object); reference = (type_reference*) emalloc(sizeof(type_reference)); - reference->info = info; reference->type = type; intern->ptr = reference; intern->ref_type = REF_TYPE_TYPE; @@ -1292,14 +1294,17 @@ static void reflection_type_factory(void *scope, zval *closure_object, void *inf reference->scope.fptr = fptr; intern->ce = fptr->common.scope; + + reference->info.arg = info; } break; case REF_INFO_PROP: reference->scope.ce = scope; intern->ce = scope; - break; + reference->info.prop = info; + break; } - + if (closure_object) { Z_ADDREF_P(closure_object); ZVAL_COPY_VALUE(&intern->obj, closure_object); @@ -3008,7 +3013,7 @@ ZEND_METHOD(reflection_type, allowsNull) switch (param->type) { case REF_INFO_ARG: { - RETVAL_BOOL(((zend_arg_info*) param->info)->allow_null); + RETVAL_BOOL(param->info.arg->allow_null); } break; @@ -3033,11 +3038,11 @@ ZEND_METHOD(reflection_type, isBuiltin) switch (param->type) { case REF_INFO_ARG: { - RETVAL_BOOL(((zend_arg_info*) param->info)->type_hint != IS_OBJECT); + RETVAL_BOOL(param->info.arg->type_hint != IS_OBJECT); } break; case REF_INFO_PROP: - RETVAL_BOOL(((zend_property_info*) param->info)->type != IS_OBJECT); + RETVAL_BOOL(param->info.prop->type != IS_OBJECT); break; } } @@ -3059,21 +3064,21 @@ ZEND_METHOD(reflection_type, __toString) switch (param->type) { case REF_INFO_ARG: { - type = ((zend_arg_info*)param->info)->type_hint; + type = param->info.arg->type_hint; if (type == IS_OBJECT) { zend_function *fptr = param->scope.fptr; - + if (fptr->type == ZEND_INTERNAL_FUNCTION && !(fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO)) { - RETURN_STRING(((zend_internal_arg_info*) param->info)->class_name); - } else RETURN_STR_COPY(((zend_arg_info*)param->info)->class_name); + RETURN_STRING(((zend_internal_arg_info*) param->info.arg)->class_name); + } else RETURN_STR_COPY(param->info.arg->class_name); } } break; case REF_INFO_PROP: { - type = ((zend_property_info*)param->info)->type; + type = param->info.prop->type; if (type == IS_OBJECT) { - RETURN_STR_COPY(((zend_property_info*)param->info)->type_name); + RETURN_STR_COPY(param->info.prop->type_name); } } break; } From 61da1b9c8ea940851abd323e95c4ae1ac3c7917b Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Fri, 11 Mar 2016 06:50:02 +0000 Subject: [PATCH 072/369] better if this makes sense ... I think --- ext/reflection/tests/ReflectionType_001.phpt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/reflection/tests/ReflectionType_001.phpt b/ext/reflection/tests/ReflectionType_001.phpt index 015525aa66e6..fe6b9891480e 100644 --- a/ext/reflection/tests/ReflectionType_001.phpt +++ b/ext/reflection/tests/ReflectionType_001.phpt @@ -89,7 +89,7 @@ $reflector = new ReflectionClass(PropTypeTest::class); foreach ($reflector->getProperties() as $name => $property) { printf("public %s $%s;\n", - $property->getName(), (string) $property->getType()); + $property->getType(), $property->getName()); } echo "** property types\n"; @@ -207,8 +207,8 @@ string(4) "Test" *** property types public int $int; public string $string; -public arr $array; +public array $arr; public callable $callable; -public std $stdClass; -public other $OtherThing; +public stdClass $std; +public OtherThing $other; ** property types From 2fde206041392f75df8f9e7eeeb92d0dfe2e9c48 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Fri, 11 Mar 2016 07:01:04 +0000 Subject: [PATCH 073/369] ReflectionProperty::hasType --- ext/reflection/php_reflection.c | 18 ++++++++++++++++++ ext/reflection/tests/ReflectionType_001.phpt | 8 ++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index b92bfdedc44b..451a6e77d101 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -5884,6 +5884,23 @@ ZEND_METHOD(reflection_property, getType) } /* }}} */ +/* {{{ proto public bool ReflectionProperty::hasType() + Returns whether property has a type */ +ZEND_METHOD(reflection_property, hasType) +{ + reflection_object *intern; + property_reference *ref; + + if (zend_parse_parameters_none() == FAILURE) { + return; + } + + GET_REFLECTION_OBJECT_PTR(ref); + + RETVAL_BOOL(ref->prop.type != 0); +} +/* }}} */ + /* {{{ proto public static mixed ReflectionExtension::export(string name [, bool return]) throws ReflectionException Exports a reflection object. Returns the output if TRUE is specified for return, printing it otherwise. */ ZEND_METHOD(reflection_extension, export) @@ -6754,6 +6771,7 @@ static const zend_function_entry reflection_property_functions[] = { ZEND_ME(reflection_property, getDocComment, arginfo_reflection__void, 0) ZEND_ME(reflection_property, setAccessible, arginfo_reflection_property_setAccessible, 0) ZEND_ME(reflection_property, getType, arginfo_reflection__void, 0) + ZEND_ME(reflection_property, hasType, arginfo_reflection__void, 0) PHP_FE_END }; diff --git a/ext/reflection/tests/ReflectionType_001.phpt b/ext/reflection/tests/ReflectionType_001.phpt index fe6b9891480e..01fdd948824d 100644 --- a/ext/reflection/tests/ReflectionType_001.phpt +++ b/ext/reflection/tests/ReflectionType_001.phpt @@ -83,13 +83,16 @@ class PropTypeTest { public callable $callable; public stdClass $std; public OtherThing $other; + public $mixed; } $reflector = new ReflectionClass(PropTypeTest::class); foreach ($reflector->getProperties() as $name => $property) { - printf("public %s $%s;\n", - $property->getType(), $property->getName()); + if ($property->hasType()) { + printf("public %s $%s;\n", + $property->getType(), $property->getName()); + } else printf("public $%s;\n", $property->getName()); } echo "** property types\n"; @@ -211,4 +214,5 @@ public array $arr; public callable $callable; public stdClass $std; public OtherThing $other; +public $mixed; ** property types From 7ed980ea7b49c41dc2d7331f686df806110fc6d9 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Fri, 11 Mar 2016 10:08:53 +0000 Subject: [PATCH 074/369] fix trait inheritance --- .../typed_properties_026.phpt | 25 +++++++++++++++++++ Zend/zend_inheritance.c | 7 +++--- 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_026.phpt 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 000000000000..62e0d8bc62b1 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_026.phpt @@ -0,0 +1,25 @@ +--TEST-- +Test typed properties inherit traits with typed properties +--FILE-- +baz; + } +} + +var_dump((new Baz)->get()); +--EXPECTF-- +Fatal error: Typed property Baz::$baz must be integer, null used in %s on line 6 + + + + + + diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index c5d1eeb3e37f..da70ce4851ff 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -1633,9 +1633,10 @@ static void zend_do_traits_property_binding(zend_class_entry *ce) /* {{{ */ if (Z_REFCOUNTED_P(prop_value)) Z_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 (property_info->type) { + zend_declare_typed_property(ce, prop_name, prop_value, flags, doc_comment, property_info->type, property_info->type_name); + } else zend_declare_property_ex(ce, prop_name, prop_value, flags, doc_comment); + zend_string_release(prop_name); } ZEND_HASH_FOREACH_END(); } From 113dc9df1a0de610b8a84db1397195a426c61d23 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Fri, 11 Mar 2016 10:11:58 +0000 Subject: [PATCH 075/369] woops --- Zend/zend_inheritance.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index da70ce4851ff..5086720ac4bf 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -1635,8 +1635,9 @@ static void zend_do_traits_property_binding(zend_class_entry *ce) /* {{{ */ doc_comment = property_info->doc_comment ? zend_string_copy(property_info->doc_comment) : NULL; if (property_info->type) { zend_declare_typed_property(ce, prop_name, prop_value, flags, doc_comment, property_info->type, property_info->type_name); - } else zend_declare_property_ex(ce, prop_name, prop_value, flags, doc_comment); - + } else { + zend_declare_property_ex(ce, prop_name, prop_value, flags, doc_comment); + } zend_string_release(prop_name); } ZEND_HASH_FOREACH_END(); } From db9e5743519756080278646ab0d8d055c86a0ae4 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Fri, 11 Mar 2016 12:28:07 +0000 Subject: [PATCH 076/369] typed properties need to be undef initial value --- Zend/tests/type_declarations/typed_properties_026.phpt | 6 +++++- Zend/zend_inheritance.c | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Zend/tests/type_declarations/typed_properties_026.phpt b/Zend/tests/type_declarations/typed_properties_026.phpt index 62e0d8bc62b1..250ea060508c 100644 --- a/Zend/tests/type_declarations/typed_properties_026.phpt +++ b/Zend/tests/type_declarations/typed_properties_026.phpt @@ -16,7 +16,11 @@ class Baz{ var_dump((new Baz)->get()); --EXPECTF-- -Fatal error: Typed property Baz::$baz must be integer, null used in %s on line 6 +Fatal error: Uncaught TypeError: 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/zend_inheritance.c b/Zend/zend_inheritance.c index 5086720ac4bf..bc11a0a38c9e 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -1634,6 +1634,9 @@ static void zend_do_traits_property_binding(zend_class_entry *ce) /* {{{ */ doc_comment = property_info->doc_comment ? zend_string_copy(property_info->doc_comment) : NULL; if (property_info->type) { + if (Z_TYPE_P(prop_value) == IS_NULL) { + ZVAL_UNDEF(prop_value); + } zend_declare_typed_property(ce, prop_name, prop_value, flags, doc_comment, property_info->type, property_info->type_name); } else { zend_declare_property_ex(ce, prop_name, prop_value, flags, doc_comment); From 87f1a37f3839299c5bdb8fd12d0d343c0aae9964 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 16 Mar 2016 16:00:56 +0000 Subject: [PATCH 077/369] only allow widening int to float at runtime --- .../type_declarations/typed_properties_027.phpt | 17 +++++++++++++++++ Zend/zend_execute.c | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_027.phpt 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 000000000000..9cb7c078173e --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_027.phpt @@ -0,0 +1,17 @@ +--TEST-- +Test typed properties int must be allowed to widen to float only at runtime +--FILE-- + +--EXPECTF-- +Fatal error: Typed property Foo::$bar must be integer, float used in %s on line 4 + + + + + + diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index d0715904e985..b02d54893e62 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -814,7 +814,7 @@ zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, } case IS_LONG: - if (Z_TYPE_P(property) == IS_DOUBLE) + if (runtime && Z_TYPE_P(property) == IS_DOUBLE) return 1; default: From 4c7404ce536e72c18442fa36952d2a3d03bf0632 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Thu, 17 Mar 2016 10:40:31 +0000 Subject: [PATCH 078/369] with much regret and sadness ... use strict types directive --- .../typed_properties_013.phpt | 3 +- .../typed_properties_014.phpt | 2 +- .../typed_properties_015.phpt | 3 +- .../typed_properties_020.phpt | 11 +- .../typed_properties_027.phpt | 3 +- .../typed_properties_028.phpt | 15 +++ .../typed_properties_029.phpt | 18 +++ Zend/zend_API.c | 18 --- Zend/zend_compile.c | 22 ++++ Zend/zend_execute.c | 14 +- Zend/zend_execute.h | 2 +- Zend/zend_vm_def.h | 6 +- Zend/zend_vm_execute.h | 120 +++++++++--------- 13 files changed, 145 insertions(+), 92 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_028.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_029.phpt diff --git a/Zend/tests/type_declarations/typed_properties_013.phpt b/Zend/tests/type_declarations/typed_properties_013.phpt index ddccec909098..177200ada7e3 100644 --- a/Zend/tests/type_declarations/typed_properties_013.phpt +++ b/Zend/tests/type_declarations/typed_properties_013.phpt @@ -7,7 +7,8 @@ class Foo { } ?> --EXPECTF-- -Fatal error: Typed property Foo::$bar must be integer, string used in %s on line 3 +Fatal error: Default value for properties with integer type can only be integer 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 index fe72459bec7b..48486078afb6 100644 --- a/Zend/tests/type_declarations/typed_properties_014.phpt +++ b/Zend/tests/type_declarations/typed_properties_014.phpt @@ -7,7 +7,7 @@ class Foo { } ?> --EXPECTF-- -Fatal error: Typed property Foo::$bar must be array, null used in %s on line 3 +Fatal error: Default value for properties with array type 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 index 0e8f7202a55c..db880ceed0c7 100644 --- a/Zend/tests/type_declarations/typed_properties_015.phpt +++ b/Zend/tests/type_declarations/typed_properties_015.phpt @@ -7,7 +7,8 @@ class Foo { } ?> --EXPECTF-- -Fatal error: Typed property Foo::$bar must be an instance of stdClass, null used in %s on line 3 +Fatal error: Default value for properties with class type are disallowed in %s on line 3 + diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt index 78a7bf4e4ade..5df6d89bd084 100644 --- a/Zend/tests/type_declarations/typed_properties_020.phpt +++ b/Zend/tests/type_declarations/typed_properties_020.phpt @@ -2,22 +2,25 @@ Test typed properties binary assign op helper test --FILE-- bar += 1; + $this->bar += 1; /* if not strict, this is okay !!!!111!! */ } } $foo = new Foo(); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Foo::$bar must be string, integer used in %s:6 +Fatal error: Uncaught TypeError: Typed property Foo::$bar must be string, integer used in %s:8 Stack trace: -#0 %s(10): Foo->__construct() +#0 %s(12): Foo->__construct() #1 {main} - thrown in %s on line 6 + thrown in %s on line 8 + diff --git a/Zend/tests/type_declarations/typed_properties_027.phpt b/Zend/tests/type_declarations/typed_properties_027.phpt index 9cb7c078173e..7509f89b1b80 100644 --- a/Zend/tests/type_declarations/typed_properties_027.phpt +++ b/Zend/tests/type_declarations/typed_properties_027.phpt @@ -8,7 +8,8 @@ class Foo { } ?> --EXPECTF-- -Fatal error: Typed property Foo::$bar must be integer, float used in %s on line 4 +Fatal error: Default value for properties with integer type can only be integer in %s on line 4 + 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 000000000000..de1b3f660232 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_028.phpt @@ -0,0 +1,15 @@ +--TEST-- +Test typed properties respect strict types (off) +--FILE-- +bar = "1"; + +var_dump($foo->bar); +?> +--EXPECT-- +int(1) diff --git a/Zend/tests/type_declarations/typed_properties_029.phpt b/Zend/tests/type_declarations/typed_properties_029.phpt new file mode 100644 index 000000000000..9e27d74d97bd --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_029.phpt @@ -0,0 +1,18 @@ +--TEST-- +Test typed properties respect strict types (on) +--FILE-- +bar = "1"; +?> +--EXPECTF-- +Fatal error: Uncaught TypeError: Typed property Foo::$bar must be integer, string used in %s:9 +Stack trace: +#0 {main} + thrown in %s on line 9 diff --git a/Zend/zend_API.c b/Zend/zend_API.c index d687fb598daf..ebb7805b471d 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3619,24 +3619,6 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name return FAILURE; } - switch (Z_TYPE_P(property)) { - case IS_UNDEF: - case IS_CONSTANT: - case IS_CONSTANT_AST: - break; - - default: { - zend_string *type_name = optional_type_name; - - if (type_name && zend_string_equals_literal_ci(type_name, "self")) { - type_name = ce->name; - } - - if (!zend_verify_property_type(ce, name, optional_type, type_name, NULL, property, 0)) { - return FAILURE; - } - } - } ce->ce_flags |= ZEND_ACC_HAS_TYPE_HINTS; } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index e87c212e94c4..96f0463b5aad 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5403,6 +5403,28 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ if (value_ast) { zend_const_expr_to_zval(&value_zv, value_ast); + + if (optional_type && !Z_CONSTANT(value_zv)) { + if (optional_type == IS_ARRAY) { + if (Z_TYPE(value_zv) != IS_ARRAY) { + zend_error_noreturn(E_COMPILE_ERROR, + "Default value for properties with array type can only be an array"); + } + } else if (optional_type == IS_CALLABLE) { + if (Z_TYPE(value_zv) != IS_ARRAY) { + zend_error_noreturn(E_COMPILE_ERROR, + "Default value for properties with callable type can only be an array"); + } + } else if (optional_type == IS_OBJECT) { + zend_error_noreturn(E_COMPILE_ERROR, + "Default value for properties with class type are disallowed"); + } else if (!ZEND_SAME_FAKE_TYPE(optional_type, Z_TYPE(value_zv))) { + zend_error_noreturn(E_COMPILE_ERROR, + "Default value for properties with %s type can only be %s", + zend_get_type_by_const(optional_type), + zend_get_type_by_const(optional_type)); + } + } } else { ZVAL_UNDEF(&value_zv); } diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index b02d54893e62..54643e1e659f 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -776,7 +776,17 @@ static int zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, zv return 1; } -zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, zend_uchar type, zend_string *type_name, zend_class_entry **type_ce, zval *property, zend_bool runtime) { +static inline zend_bool zend_verify_scalar_property_type(zend_uchar type, zval *property, zend_bool strict) { + if (EXPECTED(!strict)) { + if (UNEXPECTED(!ZEND_SAME_FAKE_TYPE(type, Z_TYPE_P(property)))) { + return zend_verify_weak_scalar_type_hint(type, property); + } + return 1; + } + return ZEND_SAME_FAKE_TYPE(type, Z_TYPE_P(property)); +} + +zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, zend_uchar type, zend_string *type_name, zend_class_entry **type_ce, zval *property, zend_bool runtime, zend_bool strict) { switch (type) { case IS_OBJECT: { zend_class_entry *pce = type_ce ? *type_ce : NULL; @@ -818,7 +828,7 @@ zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, return 1; default: - if (!ZEND_SAME_FAKE_TYPE(type, Z_TYPE_P(property))) { + if (!zend_verify_scalar_property_type(type, property, strict)) { if (runtime) { zend_throw_exception_ex(zend_ce_type_error, type, "Typed property %s::$%s must be %s, %s used", diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 133ace955d02..5727442316ab 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -362,7 +362,7 @@ void zend_cleanup_unfinished_execution(zend_execute_data *execute_data, uint32_t } \ } while (0) -zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, zend_uchar type, zend_string *type_name, zend_class_entry **type_ce, zval *property, zend_bool resolve); +zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, zend_uchar type, zend_string *type_name, zend_class_entry **type_ce, zval *property, zend_bool resolve, zend_bool strict); END_EXTERN_C() diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index c8b5b9b6fef3..4f790fc31c2c 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -738,7 +738,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -1881,7 +1881,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -2342,7 +2342,7 @@ ZEND_VM_C_LABEL(fast_assign_obj): zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index f03a94eb9a69..e1a34cdd88bf 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5626,7 +5626,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -9411,7 +9411,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -11248,7 +11248,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -13206,7 +13206,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -14467,7 +14467,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -15029,7 +15029,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -17100,7 +17100,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -17771,7 +17771,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -18115,7 +18115,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -18303,7 +18303,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -18491,7 +18491,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -18679,7 +18679,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -21600,7 +21600,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -22271,7 +22271,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -22615,7 +22615,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -22803,7 +22803,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -22991,7 +22991,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -23179,7 +23179,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -24291,7 +24291,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -24966,7 +24966,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -25310,7 +25310,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -25498,7 +25498,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -25686,7 +25686,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -25874,7 +25874,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -26896,7 +26896,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -27446,7 +27446,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -27862,7 +27862,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -28050,7 +28050,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -28238,7 +28238,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -28426,7 +28426,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -30344,7 +30344,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -30894,7 +30894,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -31310,7 +31310,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -31498,7 +31498,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -31686,7 +31686,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -31874,7 +31874,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -32731,7 +32731,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -33284,7 +33284,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -33701,7 +33701,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -33889,7 +33889,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -34077,7 +34077,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -34265,7 +34265,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -37422,7 +37422,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -38260,7 +38260,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -38720,7 +38720,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -38908,7 +38908,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -39096,7 +39096,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -39284,7 +39284,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -44072,7 +44072,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -44771,7 +44771,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -45187,7 +45187,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -45375,7 +45375,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -45563,7 +45563,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -45751,7 +45751,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -47749,7 +47749,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -48452,7 +48452,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1)) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -48869,7 +48869,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -49057,7 +49057,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -49245,7 +49245,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -49433,7 +49433,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1)) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } From 8da49500ba58020c1a1f61779fab13531f48adf9 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Thu, 17 Mar 2016 11:22:15 +0000 Subject: [PATCH 079/369] fix binary assign op surpriseness --- .../typed_properties_020.phpt | 2 +- Zend/zend_vm_def.h | 58 +- Zend/zend_vm_execute.h | 522 +++++++++--------- 3 files changed, 301 insertions(+), 281 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt index 5df6d89bd084..95d4d5b60884 100644 --- a/Zend/tests/type_declarations/typed_properties_020.phpt +++ b/Zend/tests/type_declarations/typed_properties_020.phpt @@ -8,7 +8,7 @@ class Foo { public string $bar; public function __construct() { - $this->bar += 1; /* if not strict, this is okay !!!!111!! */ + $this->bar += 1; } } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 4f790fc31c2c..a814d0f9d1f0 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -720,46 +720,48 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, property = GET_OP2_ZVAL_PTR(BP_VAR_R); - do { - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } - break; + if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); } + ZEND_VM_C_GOTO(exit_helper); } + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); + + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); } + } else { + zend_assign_op_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { + zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } - } else { - zend_assign_op_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while (0); + } +ZEND_VM_C_LABEL(exit_helper): FREE_OP(free_op_data1); FREE_OP2(); FREE_OP1_VAR_PTR(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index e1a34cdd88bf..1cfcc5c478d7 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17082,46 +17082,48 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = EX_CONSTANT(opline->op2); - do { - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } - break; + if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); } + goto exit_helper; } + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); + + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); } + } else { + zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { + zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } - } else { - zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while (0); + } +exit_helper: FREE_OP(free_op_data1); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -21582,46 +21584,48 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - do { - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } - break; + if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); } + goto exit_helper; } + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); + + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); } + } else { + zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { + zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } - } else { - zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while (0); + } +exit_helper: FREE_OP(free_op_data1); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -24273,46 +24277,48 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - do { - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } - break; + if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); } + goto exit_helper; } + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); + + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); } + } else { + zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { + zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } - } else { - zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while (0); + } +exit_helper: FREE_OP(free_op_data1); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26878,46 +26884,48 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = EX_CONSTANT(opline->op2); - do { - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } - break; + if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); } + goto exit_helper; } + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); + + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); } + } else { + zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { + zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } - } else { - zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while (0); + } +exit_helper: FREE_OP(free_op_data1); @@ -30326,46 +30334,48 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - do { - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } - break; + if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); } + goto exit_helper; } + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); + + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); } + } else { + zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { + zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } - } else { - zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while (0); + } +exit_helper: FREE_OP(free_op_data1); @@ -32713,46 +32723,48 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - do { - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } - break; + if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); } + goto exit_helper; } + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); + + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); } + } else { + zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { + zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } - } else { - zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while (0); + } +exit_helper: FREE_OP(free_op_data1); zval_ptr_dtor_nogc(free_op2); @@ -37404,46 +37416,48 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = EX_CONSTANT(opline->op2); - do { - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } - break; + if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); } + goto exit_helper; } + } + + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } - } + 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(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { + zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } - } else { - zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while (0); + } +exit_helper: FREE_OP(free_op_data1); @@ -44054,46 +44068,48 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - do { - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } - break; + if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); } + goto exit_helper; } + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); + + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); } + } else { + zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { + zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } - } else { - zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while (0); + } +exit_helper: FREE_OP(free_op_data1); @@ -47731,46 +47747,48 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - do { - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } - break; + if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); } + goto exit_helper; } + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); + + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); } + } else { + zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { + zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } - } else { - zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while (0); + } +exit_helper: FREE_OP(free_op_data1); zval_ptr_dtor_nogc(free_op2); From d80750e23efc82bc53ef0cc9d81c37db815aa3ad Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Thu, 17 Mar 2016 19:05:21 +0000 Subject: [PATCH 080/369] stuff --- Zend/zend_execute.c | 10 + Zend/zend_vm_def.h | 82 +++-- Zend/zend_vm_execute.h | 720 +++++++++++++++++++++++++---------------- 3 files changed, 512 insertions(+), 300 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 89a20b322d5d..c869765e903e 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -827,6 +827,16 @@ zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, if (runtime && Z_TYPE_P(property) == IS_DOUBLE) return 1; + case IS_CALLABLE: switch (Z_TYPE_P(property)) { + case IS_OBJECT: + if (instanceof_function(zend_ce_closure, Z_OBJCE_P(property))) + return 1; + + case IS_ARRAY: + if (zend_is_callable(property, IS_CALLABLE_CHECK_SILENT, NULL)) + return 1; + } + default: if (!zend_verify_scalar_property_type(type, property, strict)) { if (runtime) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 90a5c5b42b49..94605d49a505 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -720,48 +720,70 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, property = GET_OP2_ZVAL_PTR(BP_VAR_R); - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + do { + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); + if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + break; } - ZEND_VM_C_GOTO(exit_helper); } - } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* TODO(krakjoe) don't like these changes still ... anyone else ? */ - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - 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(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { - zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + } else { + zval _result, + *rp = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_result; + + ZVAL_UNDEF(&_result); + + zend_assign_op_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); + + if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_result); } } - } + } while(0); -ZEND_VM_C_LABEL(exit_helper): FREE_OP(free_op_data1); FREE_OP2(); FREE_OP1_VAR_PTR(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 18c5e36addeb..74c6cc3fb022 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17116,48 +17116,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = EX_CONSTANT(opline->op2); - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + do { + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); + if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + break; } - goto exit_helper; } - } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } - } else { - zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { - zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + } else { + zval _result, + *rp = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_result; - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + ZVAL_UNDEF(&_result); + + zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); + + if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_result); } } - } + } while(0); -exit_helper: FREE_OP(free_op_data1); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -21625,48 +21645,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + do { + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); + if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + break; } - goto exit_helper; } - } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } - } else { - zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } + + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + } else { + zval _result, + *rp = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_result; - /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + ZVAL_UNDEF(&_result); - if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { - zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); + zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_result); } } - } + } while(0); -exit_helper: FREE_OP(free_op_data1); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -24325,48 +24365,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + do { + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); + if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + break; } - goto exit_helper; } - } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } - } else { - zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { - zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + } else { + zval _result, + *rp = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_result; - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + ZVAL_UNDEF(&_result); + + zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); + + if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_result); } } - } + } while(0); -exit_helper: FREE_OP(free_op_data1); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26939,48 +26999,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = EX_CONSTANT(opline->op2); - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + do { + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); + if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + break; } - goto exit_helper; } - } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } - } else { - zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { - zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + } else { + zval _result, + *rp = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_result; - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + ZVAL_UNDEF(&_result); + + zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); + + if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_result); } } - } + } while(0); -exit_helper: FREE_OP(free_op_data1); @@ -30399,48 +30479,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + do { + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); + if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + break; } - goto exit_helper; } - } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } - } else { - zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } + + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + } else { + zval _result, + *rp = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_result; - /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + ZVAL_UNDEF(&_result); - if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { - zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); + zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_result); } } - } + } while(0); -exit_helper: FREE_OP(free_op_data1); @@ -32798,48 +32898,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + do { + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); + if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + break; } - goto exit_helper; } - } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } - } else { - zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } + + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + } else { + zval _result, + *rp = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_result; - /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + ZVAL_UNDEF(&_result); - if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { - zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); + zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_result); } } - } + } while(0); -exit_helper: FREE_OP(free_op_data1); zval_ptr_dtor_nogc(free_op2); @@ -37501,48 +37621,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = EX_CONSTANT(opline->op2); - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + do { + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); + if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + break; } - goto exit_helper; } - } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } - } else { - zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { - zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + } else { + zval _result, + *rp = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_result; - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + ZVAL_UNDEF(&_result); + + zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); + + if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_result); } } - } + } while(0); -exit_helper: FREE_OP(free_op_data1); @@ -44171,48 +44311,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + do { + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); + if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + break; } - goto exit_helper; } - } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } - } else { - zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { - zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + } else { + zval _result, + *rp = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_result; - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + ZVAL_UNDEF(&_result); + + zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); + + if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_result); } } - } + } while(0); -exit_helper: FREE_OP(free_op_data1); @@ -47868,48 +48028,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + do { + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - ZVAL_DEREF(object); - if (UNEXPECTED(!make_real_object(object))) { - zend_error(E_WARNING, "Attempt to assign property of non-object"); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); + if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + ZVAL_DEREF(object); + if (UNEXPECTED(!make_real_object(object))) { + zend_error(E_WARNING, "Attempt to assign property of non-object"); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + break; } - goto exit_helper; } - } - /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + /* here we are sure we are dealing with an object */ + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } - } else { - zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - /* TODO(krakjoe) I can *feel* dmitry hating me ... I hate me ... */ - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type && Z_OBJ_HT_P(object)->read_property) { - zval *prop = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), NULL); + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + } else { + zval _result, + *rp = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_result; - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, prop, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + ZVAL_UNDEF(&_result); + + zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); + + if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_result); } } - } + } while(0); -exit_helper: FREE_OP(free_op_data1); zval_ptr_dtor_nogc(free_op2); From 3628c34a2c01cfc4bd863e44510280c241430311 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Thu, 17 Mar 2016 19:17:28 +0000 Subject: [PATCH 081/369] an woops --- Zend/zend_vm_def.h | 30 +++-- Zend/zend_vm_execute.h | 288 +++++++++++++++++++++++++---------------- 2 files changed, 198 insertions(+), 120 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 634685747825..2717781dc59a 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -740,21 +740,27 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (UNEXPECTED(Z_ISERROR_P(zptr))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } } } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 07768e9cb1cf..ed8fecc678f7 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17588,25 +17588,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + /* TODO(krakjoe) don't like these changes still ... anyone else ? */ + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (UNEXPECTED(Z_ISERROR_P(zptr))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } } } } @@ -22117,25 +22125,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + /* TODO(krakjoe) don't like these changes still ... anyone else ? */ + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (UNEXPECTED(Z_ISERROR_P(zptr))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } } } } @@ -24837,25 +24853,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + /* TODO(krakjoe) don't like these changes still ... anyone else ? */ + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (UNEXPECTED(Z_ISERROR_P(zptr))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } } } } @@ -27471,25 +27495,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + /* TODO(krakjoe) don't like these changes still ... anyone else ? */ + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (UNEXPECTED(Z_ISERROR_P(zptr))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } } } } @@ -30951,25 +30983,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + /* TODO(krakjoe) don't like these changes still ... anyone else ? */ + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (UNEXPECTED(Z_ISERROR_P(zptr))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } } } } @@ -33370,25 +33410,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + /* TODO(krakjoe) don't like these changes still ... anyone else ? */ + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (UNEXPECTED(Z_ISERROR_P(zptr))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } } } } @@ -38093,25 +38141,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + /* TODO(krakjoe) don't like these changes still ... anyone else ? */ + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (UNEXPECTED(Z_ISERROR_P(zptr))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } } } } @@ -44783,25 +44839,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + /* TODO(krakjoe) don't like these changes still ... anyone else ? */ + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (UNEXPECTED(Z_ISERROR_P(zptr))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } } } } @@ -48500,25 +48564,33 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } + /* TODO(krakjoe) don't like these changes still ... anyone else ? */ + /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + if (UNEXPECTED(Z_ISERROR_P(zptr))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { + /* TODO(krakjoe) cache this */ + zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); + if (prop_info && prop_info->type) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } } } } From 72e330a508f66aac053918f604c3d202e06f79e4 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Fri, 18 Mar 2016 12:39:52 +0000 Subject: [PATCH 082/369] lift unset restriction, possibly temporarily while we argue about stuff ... --- .../typed_properties_009.phpt | 15 ++- Zend/zend_object_handlers.c | 7 +- Zend/zend_vm_def.h | 13 -- Zend/zend_vm_execute.h | 117 ------------------ 4 files changed, 18 insertions(+), 134 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_009.phpt b/Zend/tests/type_declarations/typed_properties_009.phpt index 5d749522d6f5..9c0b1ff26d7d 100644 --- a/Zend/tests/type_declarations/typed_properties_009.phpt +++ b/Zend/tests/type_declarations/typed_properties_009.phpt @@ -1,18 +1,27 @@ --TEST-- -Test typed properties disallow unset +Test typed properties unset leaves properties in an uninitialized state --FILE-- bar); + +var_dump($foo->bar); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Foo::$bar must not be unset in %s:7 +string(3) "bar" + +Fatal error: Uncaught TypeError: Typed property Foo::$bar must not be accessed before initialization in %s:14 Stack trace: #0 {main} - thrown in %s on line 7 + thrown in %s on line 14 diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 457e25fa631d..5c4fb3e10785 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -520,6 +520,7 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ zval tmp_member; zval *retval; uint32_t property_offset; + zend_property_info *prop_info = NULL; zobj = Z_OBJ_P(object); @@ -593,7 +594,11 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ } } if ((type != BP_VAR_IS)) { - zend_error(E_NOTICE,"Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), Z_STRVAL_P(member)); + if (EXPECTED(!(zobj->ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) || + !(prop_info = zend_hash_find_ptr(&zobj->ce->properties_info, Z_STR_P(member))) || + !prop_info->type)) { + zend_error(E_NOTICE,"Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), Z_STRVAL_P(member)); + } } retval = &EG(uninitialized_zval); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 2717781dc59a..b29d0c04347b 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -5988,19 +5988,6 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) } } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } - } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index ed8fecc678f7..a7201a92b00c 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -20148,19 +20148,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDL } } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } - } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -24658,19 +24645,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER( } } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } - } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -27280,19 +27254,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR_HAND } } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } - } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -29668,19 +29629,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HA } } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } - } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -33030,19 +32978,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDL } } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } - } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -35463,19 +35398,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR_H } } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } - } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -41072,19 +40994,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLE } } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } - } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -47583,19 +47492,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(Z } } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } - } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -51205,19 +51101,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMPVAR_HANDL } } - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(offset) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } - } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { From 90fde77b7a5cb1b1c889714333f36003957358c2 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Fri, 18 Mar 2016 12:50:40 +0000 Subject: [PATCH 083/369] add test --- .../typed_properties_030.phpt | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_030.phpt 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 000000000000..2749948a6839 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_030.phpt @@ -0,0 +1,25 @@ +--TEST-- +Test typed properties unset __get magical magic +--FILE-- +bar = "1"; # ok + +unset($foo->bar); # ok + +var_dump($foo->bar); # not okay, __get is nasty +?> +--EXPECTF-- +Fatal error: Uncaught TypeError: Typed property Foo::$bar must be integer, string used in %s:16 +Stack trace: +#0 {main} + thrown in %s on line 16 From 8ce90144be253293c1a3252f2c2f6e52bc25f1d2 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Fri, 18 Mar 2016 16:28:57 +0000 Subject: [PATCH 084/369] tidy up vm stuff --- Zend/zend_execute.c | 30 + Zend/zend_execute.h | 21 + Zend/zend_vm_def.h | 112 ++- Zend/zend_vm_execute.h | 1619 +++++++++++++++++----------------------- 4 files changed, 778 insertions(+), 1004 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 2586bcbfa143..1ae8b251b07d 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -777,6 +777,36 @@ static int zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, zv return 1; } +zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *property, void **cache) { + /* TODO(krakjoe) use cache */ + do { + if (UNEXPECTED(Z_TYPE_P(property) != IS_STRING)) { + break; + } + + if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + if (Z_ISREF_P(object)) { + object = Z_REFVAL_P(object); + if (Z_TYPE_P(object) != IS_OBJECT) + break; + } else { + break; + } + } + + if (EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *info = zend_hash_find_ptr( + &Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + + if (UNEXPECTED(info && info->type)) { + return info; + } + } + } while (0); + + return NULL; +} + static inline zend_bool zend_verify_scalar_property_type(zend_uchar type, zval *property, zend_bool strict) { if (EXPECTED(!strict)) { if (UNEXPECTED(!ZEND_SAME_FAKE_TYPE(type, Z_TYPE_P(property)))) { diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 5727442316ab..1e309dc1d8ac 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -362,6 +362,27 @@ void zend_cleanup_unfinished_execution(zend_execute_data *execute_data, uint32_t } \ } while (0) +static zend_always_inline zend_bool _zend_object_has_type_hints(zval *object) { + do { + if (Z_TYPE_P(object) != IS_OBJECT) { + if (Z_ISREF_P(object)) { + object = Z_REFVAL_P(object); + if (Z_TYPE_P(object) != IS_OBJECT) + break; + } else { + break; + } + } + + return (Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) == ZEND_ACC_HAS_TYPE_HINTS; + } while (0); + + return 0; +} + +#define ZEND_OBJECT_HAS_TYPE_HINTS(object) _zend_object_has_type_hints(object) + +zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *property, void **cache); zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, zend_uchar type, zend_string *type_name, zend_class_entry **type_ce, zval *property, zend_bool resolve, zend_bool strict); END_EXTERN_C() diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b29d0c04347b..7ec9a5402761 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -753,11 +753,10 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -773,11 +772,10 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_assign_op_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -1906,22 +1904,19 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): } } while (0); - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + + if (prop_info) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } } } @@ -1948,25 +1943,21 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ... grrr */ - /* we require a deref'd var here, but fetch does not */ - /* do we have to unconditionally deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); - } - } break; + } break; + } } } } @@ -2105,18 +2096,15 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST } /* TODO(krakjoe) deref container problem again */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (prop_info) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -2149,14 +2137,13 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) property = GET_OP2_ZVAL_PTR(BP_VAR_R); - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -2373,15 +2360,12 @@ ZEND_VM_C_LABEL(fast_assign_obj): ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -6164,7 +6148,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) FREE_OP1_VAR_PTR(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a7201a92b00c..3ef51484e8a2 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4265,7 +4265,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -5627,21 +5627,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H } } while (0); - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + + if (prop_info) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -5751,18 +5748,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ } /* TODO(krakjoe) deref container problem again */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (prop_info) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -9423,21 +9417,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND } } while (0); - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + + if (prop_info) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -9547,18 +9538,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ } /* TODO(krakjoe) deref container problem again */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (prop_info) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -11271,21 +11259,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ } } while (0); - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + + if (prop_info) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -11396,18 +11381,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ } /* TODO(krakjoe) deref container problem again */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (prop_info) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -13181,7 +13163,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_TMP_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -13686,21 +13668,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN } } while (0); - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + + if (prop_info) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -13738,18 +13717,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO } /* TODO(krakjoe) deref container problem again */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (prop_info) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -14947,21 +14923,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE } } while (0); - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + + if (prop_info) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -14999,18 +14972,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV } /* TODO(krakjoe) deref container problem again */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (prop_info) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -15509,21 +15479,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA } } while (0); - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + + if (prop_info) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -15561,18 +15528,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM } /* TODO(krakjoe) deref container problem again */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (prop_info) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -16791,7 +16755,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -17607,11 +17571,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -17627,11 +17590,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -18288,21 +18250,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN } } while (0); - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + + if (prop_info) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -18330,25 +18289,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ... grrr */ - /* we require a deref'd var here, but fetch does not */ - /* do we have to unconditionally deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); - } - } break; + } break; + } } } } @@ -18414,18 +18369,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO } /* TODO(krakjoe) deref container problem again */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (prop_info) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -18458,14 +18410,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST property = EX_CONSTANT(opline->op2); - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -18638,15 +18589,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -18826,15 +18774,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -19014,15 +18959,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -19202,15 +19144,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -22131,11 +22070,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -22151,11 +22089,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -22812,21 +22749,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE } } while (0); - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + + if (prop_info) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -22854,25 +22788,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ... grrr */ - /* we require a deref'd var here, but fetch does not */ - /* do we have to unconditionally deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); - } - } break; + } break; + } } } } @@ -22938,18 +22868,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV } /* TODO(krakjoe) deref container problem again */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (prop_info) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -22982,14 +22909,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HA property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -23162,15 +23088,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -23350,15 +23273,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -23538,15 +23458,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -23726,15 +23643,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -24846,11 +24760,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -24866,11 +24779,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -25531,21 +25443,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA } } while (0); - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + + if (prop_info) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -25573,25 +25482,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ... grrr */ - /* we require a deref'd var here, but fetch does not */ - /* do we have to unconditionally deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); - } - } break; + } break; + } } } } @@ -25657,18 +25562,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM } /* TODO(krakjoe) deref container problem again */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (prop_info) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -25701,14 +25603,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVA property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -25881,15 +25782,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -26069,15 +25967,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -26257,15 +26152,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -26445,15 +26337,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -27475,11 +27364,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -27495,11 +27383,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -28035,21 +27922,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ } } while (0); - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + + if (prop_info) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -28077,25 +27961,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ... grrr */ - /* we require a deref'd var here, but fetch does not */ - /* do we have to unconditionally deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); - } - } break; + } break; + } } } } @@ -28233,18 +28113,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED } /* TODO(krakjoe) deref container problem again */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (prop_info) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -28277,14 +28154,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CO property = EX_CONSTANT(opline->op2); - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -28457,15 +28333,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -28645,15 +28518,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -28833,15 +28703,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -29021,15 +28888,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -30950,11 +30814,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -30970,11 +30833,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -31510,21 +31372,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN } } while (0); - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + + if (prop_info) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -31552,25 +31411,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ... grrr */ - /* we require a deref'd var here, but fetch does not */ - /* do we have to unconditionally deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); - } - } break; + } break; + } } } } @@ -31708,18 +31563,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED } /* TODO(krakjoe) deref container problem again */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (prop_info) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -31752,14 +31604,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -31932,15 +31783,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -32120,15 +31968,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -32308,15 +32153,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -32496,15 +32338,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -33364,11 +33203,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -33384,11 +33222,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -33927,21 +33764,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR } } while (0); - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + + if (prop_info) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -33969,25 +33803,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ... grrr */ - /* we require a deref'd var here, but fetch does not */ - /* do we have to unconditionally deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); - } - } break; + } break; + } } } } @@ -34126,18 +33956,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED } /* TODO(krakjoe) deref container problem again */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (prop_info) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -34170,14 +33997,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TM property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -34350,15 +34176,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -34538,15 +34361,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -34726,15 +34546,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -34914,15 +34731,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -36969,7 +36783,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(Z_OBJCE_P(array_ptr)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -38082,11 +37896,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -38102,11 +37915,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -38930,21 +38742,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND } } while (0); - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + + if (prop_info) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -38972,25 +38781,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ... grrr */ - /* we require a deref'd var here, but fetch does not */ - /* do we have to unconditionally deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); - } - } break; + } break; + } } } } @@ -39128,18 +38933,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON } /* TODO(krakjoe) deref container problem again */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (prop_info) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -39172,14 +38974,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_ property = EX_CONSTANT(opline->op2); - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -39396,15 +39197,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -39584,15 +39382,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -39772,15 +39567,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -39960,15 +39752,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -44767,11 +44556,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -44787,11 +44575,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -45476,21 +45263,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER } } while (0); - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + + if (prop_info) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -45518,25 +45302,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ... grrr */ - /* we require a deref'd var here, but fetch does not */ - /* do we have to unconditionally deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); - } - } break; + } break; + } } } } @@ -45674,18 +45454,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ } /* TODO(krakjoe) deref container problem again */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (prop_info) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -45718,14 +45495,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HAN property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -45898,15 +45674,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -46086,15 +45859,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -46274,15 +46044,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -46462,15 +46229,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -48479,11 +48243,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -48499,11 +48262,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - if (UNEXPECTED(Z_TYPE_P(object) == IS_OBJECT && Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) cache this */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } @@ -49192,21 +48954,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN } } while (0); - if (UNEXPECTED(Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(offset) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(offset)); - - if (prop_info && prop_info->type) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(Z_OBJCE_P(container)->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + + if (prop_info) { + if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(offset)); + HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -49234,25 +48993,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container ... grrr */ - /* we require a deref'd var here, but fetch does not */ - /* do we have to unconditionally deref container ? */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last]) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); - } - } break; + } break; + } } } } @@ -49391,18 +49146,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP } /* TODO(krakjoe) deref container problem again */ - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); - - if (prop_info && prop_info->type) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(Z_OBJCE_P(container)->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (prop_info) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -49435,14 +49187,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT && (Z_OBJCE_P(container)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) && Z_TYPE_P(property) == IS_STRING)) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(container)->properties_info, Z_STR_P(property)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - if (prop_info && prop_info->type) { + if (prop_info) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be unset", - ZSTR_VAL(Z_OBJCE_P(container)->name), + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -49615,15 +49366,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -49803,15 +49551,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -49991,15 +49736,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -50179,15 +49921,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - if (UNEXPECTED(Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { - if (Z_TYPE_P(property_name) == IS_STRING) { - /* TODO(krakjoe) needs caching */ - zend_property_info *prop_info = zend_hash_find_ptr(&Z_OBJCE_P(object)->properties_info, Z_STR_P(property_name)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); - if (prop_info && prop_info->type) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } From d2df32972fad53d972c107ab266e67ca146e62b1 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Fri, 18 Mar 2016 17:42:59 +0000 Subject: [PATCH 085/369] some consistency --- .../typed_properties_019.phpt | 18 +- .../typed_properties_031.phpt | 22 + Zend/zend_execute.c | 12 +- Zend/zend_vm_def.h | 42 +- Zend/zend_vm_execute.h | 378 +++++++++++++++++- 5 files changed, 452 insertions(+), 20 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_031.phpt diff --git a/Zend/tests/type_declarations/typed_properties_019.phpt b/Zend/tests/type_declarations/typed_properties_019.phpt index a7bec8a75b4c..e9149e1c1c79 100644 --- a/Zend/tests/type_declarations/typed_properties_019.phpt +++ b/Zend/tests/type_declarations/typed_properties_019.phpt @@ -1,19 +1,25 @@ --TEST-- -Test typed properties int must be allowed to widen to float +Test typed properties int must not be allowed to overflow --FILE-- bar; + } } $foo = new Foo(); -$foo->bar = 2.2; -var_dump($foo->bar); +var_dump($foo->inc()); ?> ---EXPECT-- -float(2.2) +--EXPECTF-- +Fatal error: Uncaught TypeError: Typed property Foo::$bar must be integer, float used in %s:6 +Stack trace: +#0 %s(12): Foo->inc() +#1 {main} + thrown in %s on line 6 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 000000000000..8022d2ef72bc --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_031.phpt @@ -0,0 +1,22 @@ +--TEST-- +Test typed properties coerce int to float even in strict mode +--FILE-- +bar = $value; + } +} + +$bar = new Bar(); + +$bar->setBar(100); + +var_dump($bar->bar); +--EXPECT-- +float(100) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 1ae8b251b07d..038e1f93f0ea 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -814,6 +814,14 @@ static inline zend_bool zend_verify_scalar_property_type(zend_uchar type, zval * } return 1; } + + if (UNEXPECTED(type == IS_DOUBLE && Z_TYPE_P(property) == IS_LONG)) { + double dest = (double) Z_LVAL_P(property); + zval_ptr_dtor(property); + ZVAL_DOUBLE(property, dest); + return 1; + } + return ZEND_SAME_FAKE_TYPE(type, Z_TYPE_P(property)); } @@ -854,10 +862,6 @@ zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, return 1; } - case IS_LONG: - if (runtime && Z_TYPE_P(property) == IS_DOUBLE) - return 1; - case IS_CALLABLE: switch (Z_TYPE_P(property)) { case IS_OBJECT: if (instanceof_function(zend_ce_closure, Z_OBJCE_P(property))) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7ec9a5402761..b1613ec6bb15 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1178,12 +1178,42 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, decrement_function(zptr); } } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zval _rv; + zval *rv = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_rv; + ZVAL_UNDEF(&_rv); + + zend_pre_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_rv); + } } } while (0); @@ -1259,6 +1289,16 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } else { zend_post_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } } while (0); FREE_OP2(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 3ef51484e8a2..f9e5c34017e4 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17994,12 +17994,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zval _rv; + zval *rv = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_rv; + ZVAL_UNDEF(&_rv); + + zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_rv); + } } } while (0); @@ -18074,6 +18104,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } } while (0); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22493,12 +22533,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zval _rv; + zval *rv = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_rv; + ZVAL_UNDEF(&_rv); + + zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_rv); + } } } while (0); @@ -22573,6 +22643,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } } while (0); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25185,12 +25265,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zval _rv; + zval *rv = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_rv; + ZVAL_UNDEF(&_rv); + + zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_rv); + } } } while (0); @@ -25266,6 +25376,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } } while (0); zval_ptr_dtor_nogc(free_op2); @@ -27757,12 +27877,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zval _rv; + zval *rv = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_rv; + ZVAL_UNDEF(&_rv); + + zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_rv); + } } } while (0); @@ -27837,6 +27987,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } } while (0); @@ -31207,12 +31367,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zval _rv; + zval *rv = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_rv; + ZVAL_UNDEF(&_rv); + + zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_rv); + } } } while (0); @@ -31287,6 +31477,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } } while (0); @@ -33597,12 +33797,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zval _rv; + zval *rv = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_rv; + ZVAL_UNDEF(&_rv); + + zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_rv); + } } } while (0); @@ -33678,6 +33908,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } } while (0); zval_ptr_dtor_nogc(free_op2); @@ -38319,12 +38559,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zval _rv; + zval *rv = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_rv; + ZVAL_UNDEF(&_rv); + + zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_rv); + } } } while (0); @@ -38399,6 +38669,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } } while (0); @@ -44979,12 +45259,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zval _rv; + zval *rv = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_rv; + ZVAL_UNDEF(&_rv); + + zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_rv); + } } } while (0); @@ -45059,6 +45369,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } } while (0); @@ -48668,12 +48988,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zval _rv; + zval *rv = RETURN_VALUE_USED(opline) ? + EX_VAR(opline->result.var) : &_rv; + ZVAL_UNDEF(&_rv); + + zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&_rv); + } } } while (0); @@ -48749,6 +49099,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); + } + } + } } while (0); zval_ptr_dtor_nogc(free_op2); From d01e02bb9f7f97725ea7ef9574660c29faf83d80 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sat, 19 Mar 2016 11:47:50 +0000 Subject: [PATCH 086/369] this kind of type verification only happens at runtime --- Zend/zend_execute.c | 59 +++++-------- Zend/zend_execute.h | 2 +- Zend/zend_vm_def.h | 14 +-- Zend/zend_vm_execute.h | 192 ++++++++++++++++++++--------------------- 4 files changed, 124 insertions(+), 143 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 038e1f93f0ea..b855df1756a6 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -825,38 +825,28 @@ static inline zend_bool zend_verify_scalar_property_type(zend_uchar type, zval * return ZEND_SAME_FAKE_TYPE(type, Z_TYPE_P(property)); } -zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, zend_uchar type, zend_string *type_name, zend_class_entry **type_ce, zval *property, zend_bool runtime, zend_bool strict) { +zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, zend_uchar type, zend_string *type_name, zend_class_entry **type_ce, zval *property, zend_bool strict) { switch (type) { case IS_OBJECT: { zend_class_entry *pce = type_ce ? *type_ce : NULL; - zend_string *resolved = runtime ? zend_resolve_property_type(type_name, scope) : type_name; - - if (!pce && runtime) { + zend_string *resolved = zend_resolve_property_type(type_name, scope); + + if (!pce) { pce = zend_lookup_class(resolved); - if (type_ce) { *type_ce = pce; } } - if (Z_TYPE_P(property) != IS_OBJECT || !runtime || !instanceof_function(pce, Z_OBJCE_P(property))) { - if (runtime) { - zend_throw_exception_ex(zend_ce_type_error, type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(scope->name), - ZSTR_VAL(name), - ZSTR_VAL(resolved), - Z_TYPE_P(property) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(property)->name) : - zend_get_type_by_const(Z_TYPE_P(property))); - } else { - zend_error(scope->type == ZEND_USER_CLASS ? E_COMPILE_ERROR : E_CORE_ERROR, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(scope->name), - ZSTR_VAL(name), - ZSTR_VAL(resolved), + if (Z_TYPE_P(property) != IS_OBJECT || !instanceof_function(pce, Z_OBJCE_P(property))) { + zend_throw_exception_ex(zend_ce_type_error, type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(scope->name), + ZSTR_VAL(name), + ZSTR_VAL(resolved), + Z_TYPE_P(property) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(property)->name) : zend_get_type_by_const(Z_TYPE_P(property))); - } return 0; } return 1; @@ -874,23 +864,14 @@ zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, default: if (!zend_verify_scalar_property_type(type, property, strict)) { - if (runtime) { - zend_throw_exception_ex(zend_ce_type_error, type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(scope->name), - ZSTR_VAL(name), - zend_get_type_by_const(type), - Z_TYPE_P(property) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(property)->name) : - zend_get_type_by_const(Z_TYPE_P(property))); - } else { - zend_error(scope->type == ZEND_USER_CLASS ? E_COMPILE_ERROR : E_CORE_ERROR, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(scope->name), - ZSTR_VAL(name), - zend_get_type_by_const(type), - zend_get_type_by_const(Z_TYPE_P(property))); - } + zend_throw_exception_ex(zend_ce_type_error, type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(scope->name), + ZSTR_VAL(name), + zend_get_type_by_const(type), + Z_TYPE_P(property) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(property)->name) : + zend_get_type_by_const(Z_TYPE_P(property))); return 0; } return 1; diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 1e309dc1d8ac..f0ef398e3638 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -383,7 +383,7 @@ static zend_always_inline zend_bool _zend_object_has_type_hints(zval *object) { #define ZEND_OBJECT_HAS_TYPE_HINTS(object) _zend_object_has_type_hints(object) zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *property, void **cache); -zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, zend_uchar type, zend_string *type_name, zend_class_entry **type_ce, zval *property, zend_bool resolve, zend_bool strict); +zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, zend_uchar type, zend_string *type_name, zend_class_entry **type_ce, zval *property, zend_bool strict); END_EXTERN_C() diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b1613ec6bb15..16e1552048dd 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -757,7 +757,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -776,7 +776,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -1183,7 +1183,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -1205,7 +1205,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -1294,7 +1294,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -1954,7 +1954,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -2404,7 +2404,7 @@ ZEND_VM_C_LABEL(fast_assign_obj): zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index f9e5c34017e4..b169cb12c3f7 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5637,7 +5637,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -9427,7 +9427,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -11269,7 +11269,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -13678,7 +13678,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -14933,7 +14933,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -15489,7 +15489,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -17575,7 +17575,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -17594,7 +17594,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -17999,7 +17999,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -18021,7 +18021,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -18109,7 +18109,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -18300,7 +18300,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -18633,7 +18633,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -18818,7 +18818,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -19003,7 +19003,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -19188,7 +19188,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -22114,7 +22114,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -22133,7 +22133,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -22538,7 +22538,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -22560,7 +22560,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -22648,7 +22648,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -22839,7 +22839,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -23172,7 +23172,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -23357,7 +23357,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -23542,7 +23542,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -23727,7 +23727,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -24844,7 +24844,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -24863,7 +24863,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -25270,7 +25270,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -25292,7 +25292,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -25381,7 +25381,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -25573,7 +25573,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -25906,7 +25906,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -26091,7 +26091,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -26276,7 +26276,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -26461,7 +26461,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -27488,7 +27488,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -27507,7 +27507,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -27882,7 +27882,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -27904,7 +27904,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -27992,7 +27992,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -28092,7 +28092,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -28497,7 +28497,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -28682,7 +28682,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -28867,7 +28867,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -29052,7 +29052,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -30978,7 +30978,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -30997,7 +30997,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -31372,7 +31372,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -31394,7 +31394,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -31482,7 +31482,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -31582,7 +31582,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -31987,7 +31987,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -32172,7 +32172,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -32357,7 +32357,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -32542,7 +32542,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -33407,7 +33407,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -33426,7 +33426,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -33802,7 +33802,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -33824,7 +33824,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -33913,7 +33913,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -34014,7 +34014,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -34420,7 +34420,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -34605,7 +34605,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -34790,7 +34790,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -34975,7 +34975,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -38140,7 +38140,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -38159,7 +38159,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -38564,7 +38564,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -38586,7 +38586,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -38674,7 +38674,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -39032,7 +39032,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -39481,7 +39481,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -39666,7 +39666,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -39851,7 +39851,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -40036,7 +40036,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -44840,7 +44840,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -44859,7 +44859,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -45264,7 +45264,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -45286,7 +45286,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -45374,7 +45374,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -45593,7 +45593,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -45998,7 +45998,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -46183,7 +46183,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -46368,7 +46368,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -46553,7 +46553,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -48567,7 +48567,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -48586,7 +48586,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -48993,7 +48993,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -49015,7 +49015,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -49104,7 +49104,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -49324,7 +49324,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), 1, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -49730,7 +49730,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -49915,7 +49915,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -50100,7 +50100,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -50285,7 +50285,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, 1, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } From e3e46f0ec080ef17db249b3dc57c72b728219d06 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sat, 19 Mar 2016 11:57:09 +0000 Subject: [PATCH 087/369] info always available --- Zend/zend_execute.c | 32 +++---- Zend/zend_execute.h | 2 +- Zend/zend_vm_def.h | 14 +-- Zend/zend_vm_execute.h | 192 ++++++++++++++++++++--------------------- 4 files changed, 118 insertions(+), 122 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index b855df1756a6..dbcc43acf5d5 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -825,24 +825,20 @@ static inline zend_bool zend_verify_scalar_property_type(zend_uchar type, zval * return ZEND_SAME_FAKE_TYPE(type, Z_TYPE_P(property)); } -zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, zend_uchar type, zend_string *type_name, zend_class_entry **type_ce, zval *property, zend_bool strict) { - switch (type) { +zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) { + switch (info->type) { case IS_OBJECT: { - zend_class_entry *pce = type_ce ? *type_ce : NULL; - zend_string *resolved = zend_resolve_property_type(type_name, scope); + zend_string *resolved = zend_resolve_property_type(info->type_name, info->ce); - if (!pce) { - pce = zend_lookup_class(resolved); - if (type_ce) { - *type_ce = pce; - } + if (!info->type_ce) { + info->type_ce = zend_lookup_class(resolved); } - if (Z_TYPE_P(property) != IS_OBJECT || !instanceof_function(pce, Z_OBJCE_P(property))) { - zend_throw_exception_ex(zend_ce_type_error, type, + if (Z_TYPE_P(property) != IS_OBJECT || !instanceof_function(info->type_ce, Z_OBJCE_P(property))) { + zend_throw_exception_ex(zend_ce_type_error, info->type, "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(scope->name), - ZSTR_VAL(name), + ZSTR_VAL(info->ce->name), + ZSTR_VAL(info->name), ZSTR_VAL(resolved), Z_TYPE_P(property) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(property)->name) : @@ -863,12 +859,12 @@ zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, } default: - if (!zend_verify_scalar_property_type(type, property, strict)) { - zend_throw_exception_ex(zend_ce_type_error, type, + if (!zend_verify_scalar_property_type(info->type, property, strict)) { + zend_throw_exception_ex(zend_ce_type_error, info->type, "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(scope->name), - ZSTR_VAL(name), - zend_get_type_by_const(type), + ZSTR_VAL(info->ce->name), + ZSTR_VAL(info->name), + zend_get_type_by_const(info->type), Z_TYPE_P(property) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(property)->name) : zend_get_type_by_const(Z_TYPE_P(property))); diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index f0ef398e3638..ed61d6f8cbb3 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -383,7 +383,7 @@ static zend_always_inline zend_bool _zend_object_has_type_hints(zval *object) { #define ZEND_OBJECT_HAS_TYPE_HINTS(object) _zend_object_has_type_hints(object) zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *property, void **cache); -zend_bool zend_verify_property_type(zend_class_entry *scope, zend_string *name, zend_uchar type, zend_string *type_name, zend_class_entry **type_ce, zval *property, zend_bool strict); +zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict); END_EXTERN_C() diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 16e1552048dd..9d27b63d589e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -757,7 +757,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -776,7 +776,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -1183,7 +1183,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -1205,7 +1205,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -1294,7 +1294,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -1954,7 +1954,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -2404,7 +2404,7 @@ ZEND_VM_C_LABEL(fast_assign_obj): zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index b169cb12c3f7..583ce733427b 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5637,7 +5637,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -9427,7 +9427,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -11269,7 +11269,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -13678,7 +13678,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -14933,7 +14933,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -15489,7 +15489,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -17575,7 +17575,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -17594,7 +17594,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -17999,7 +17999,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -18021,7 +18021,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -18109,7 +18109,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -18300,7 +18300,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -18633,7 +18633,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -18818,7 +18818,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -19003,7 +19003,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -19188,7 +19188,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -22114,7 +22114,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -22133,7 +22133,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -22538,7 +22538,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -22560,7 +22560,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -22648,7 +22648,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -22839,7 +22839,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -23172,7 +23172,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -23357,7 +23357,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -23542,7 +23542,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -23727,7 +23727,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -24844,7 +24844,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -24863,7 +24863,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -25270,7 +25270,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -25292,7 +25292,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -25381,7 +25381,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -25573,7 +25573,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -25906,7 +25906,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -26091,7 +26091,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -26276,7 +26276,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -26461,7 +26461,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -27488,7 +27488,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -27507,7 +27507,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -27882,7 +27882,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -27904,7 +27904,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -27992,7 +27992,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -28092,7 +28092,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -28497,7 +28497,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -28682,7 +28682,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -28867,7 +28867,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -29052,7 +29052,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -30978,7 +30978,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -30997,7 +30997,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -31372,7 +31372,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -31394,7 +31394,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -31482,7 +31482,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -31582,7 +31582,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -31987,7 +31987,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -32172,7 +32172,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -32357,7 +32357,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -32542,7 +32542,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -33407,7 +33407,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -33426,7 +33426,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -33802,7 +33802,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -33824,7 +33824,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -33913,7 +33913,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -34014,7 +34014,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -34420,7 +34420,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -34605,7 +34605,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -34790,7 +34790,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -34975,7 +34975,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -38140,7 +38140,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -38159,7 +38159,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -38564,7 +38564,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -38586,7 +38586,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -38674,7 +38674,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -39032,7 +39032,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -39481,7 +39481,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -39666,7 +39666,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -39851,7 +39851,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -40036,7 +40036,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -44840,7 +44840,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -44859,7 +44859,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -45264,7 +45264,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -45286,7 +45286,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -45374,7 +45374,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -45593,7 +45593,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -45998,7 +45998,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -46183,7 +46183,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -46368,7 +46368,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -46553,7 +46553,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -48567,7 +48567,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -48586,7 +48586,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, rp, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -48993,7 +48993,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, zptr, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -49015,7 +49015,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -49104,7 +49104,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -49324,7 +49324,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info->ce, Z_STR_P(offset), prop_info->type, prop_info->type_name, &prop_info->type_ce, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -49730,7 +49730,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -49915,7 +49915,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -50100,7 +50100,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } @@ -50285,7 +50285,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); if (prop_info) { - if (!zend_verify_property_type(prop_info->ce, Z_STR_P(property_name), prop_info->type, prop_info->type_name, &prop_info->type_ce, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { HANDLE_EXCEPTION(); } } From 5037a74e9d57e3f6b9ad43be39d0467e79f66dda Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sat, 19 Mar 2016 12:55:20 +0000 Subject: [PATCH 088/369] improve error message to distinguish between arg by reference and by reference assignment --- .../typed_properties_010.phpt | 2 +- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 30 +++++++++---------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_010.phpt b/Zend/tests/type_declarations/typed_properties_010.phpt index 3ef8eceb5f15..b13d78263728 100644 --- a/Zend/tests/type_declarations/typed_properties_010.phpt +++ b/Zend/tests/type_declarations/typed_properties_010.phpt @@ -14,7 +14,7 @@ $foo = new Foo(); $cb($foo->bar); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Foo::$bar must not be referenced in %s:11 +Fatal error: Uncaught TypeError: Typed property Foo::$bar must not be passed by reference in %s:11 Stack trace: #0 {main} thrown in %s on line 11 diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 9d27b63d589e..2db5d203208f 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2142,7 +2142,7 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST if (prop_info) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", + "Typed property %s::$%s must not be passed by reference", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 583ce733427b..dabf976f0653 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5754,7 +5754,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ if (prop_info) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", + "Typed property %s::$%s must not be passed by reference", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -9544,7 +9544,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ if (prop_info) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", + "Typed property %s::$%s must not be passed by reference", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -11387,7 +11387,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ if (prop_info) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", + "Typed property %s::$%s must not be passed by reference", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -13723,7 +13723,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO if (prop_info) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", + "Typed property %s::$%s must not be passed by reference", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -14978,7 +14978,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV if (prop_info) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", + "Typed property %s::$%s must not be passed by reference", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -15534,7 +15534,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM if (prop_info) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", + "Typed property %s::$%s must not be passed by reference", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -18415,7 +18415,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO if (prop_info) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", + "Typed property %s::$%s must not be passed by reference", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -22954,7 +22954,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV if (prop_info) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", + "Typed property %s::$%s must not be passed by reference", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -25688,7 +25688,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM if (prop_info) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", + "Typed property %s::$%s must not be passed by reference", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -28279,7 +28279,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED if (prop_info) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", + "Typed property %s::$%s must not be passed by reference", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -31769,7 +31769,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED if (prop_info) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", + "Typed property %s::$%s must not be passed by reference", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -34202,7 +34202,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED if (prop_info) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", + "Typed property %s::$%s must not be passed by reference", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -39219,7 +39219,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON if (prop_info) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", + "Typed property %s::$%s must not be passed by reference", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -45780,7 +45780,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ if (prop_info) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", + "Typed property %s::$%s must not be passed by reference", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } @@ -49512,7 +49512,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP if (prop_info) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", + "Typed property %s::$%s must not be passed by reference", ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); HANDLE_EXCEPTION(); } From b2d5f55076e4b136b451b8ccb613277d33039eb5 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sat, 19 Mar 2016 13:13:43 +0000 Subject: [PATCH 089/369] not needed --- Zend/zend_vm_def.h | 12 ----- Zend/zend_vm_execute.h | 108 ----------------------------------------- 2 files changed, 120 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 2db5d203208f..adaefcd32d17 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2177,18 +2177,6 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) property = GET_OP2_ZVAL_PTR(BP_VAR_R); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - - if (prop_info) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } - zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index dabf976f0653..791ac6ae4e70 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18450,18 +18450,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST property = EX_CONSTANT(opline->op2); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - - if (prop_info) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -22989,18 +22977,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HA property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - - if (prop_info) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -25723,18 +25699,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVA property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - - if (prop_info) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -28314,18 +28278,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CO property = EX_CONSTANT(opline->op2); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - - if (prop_info) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -31804,18 +31756,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - - if (prop_info) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -34237,18 +34177,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TM property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - - if (prop_info) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -39254,18 +39182,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_ property = EX_CONSTANT(opline->op2); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - - if (prop_info) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -45815,18 +45731,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HAN property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - - if (prop_info) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -49547,18 +49451,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); - - if (prop_info) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be unset", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { From 5e57cda0229d0e36428af47e03a271254c7d4634 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sat, 19 Mar 2016 15:21:50 +0000 Subject: [PATCH 090/369] check in rw fetch, not sure about this ? --- Zend/zend_vm_def.h | 23 +++- Zend/zend_vm_execute.h | 213 +++++++++++++++++++++++++++++++------ ext/opcache/zend_persist.c | 2 +- 3 files changed, 201 insertions(+), 37 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index adaefcd32d17..d7d22c8bb3e1 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -734,8 +734,6 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } } - /* TODO(krakjoe) don't like these changes still ... anyone else ? */ - /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -2027,6 +2025,26 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) FREE_OP2(); HANDLE_EXCEPTION(); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; + } + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -2135,7 +2153,6 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container problem again */ if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 791ac6ae4e70..45f2eaf3b054 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5747,7 +5747,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container problem again */ if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); @@ -9537,7 +9536,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container problem again */ if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); @@ -11380,7 +11378,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container problem again */ if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); @@ -13716,7 +13713,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container problem again */ if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); @@ -14971,7 +14967,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container problem again */ if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); @@ -15527,7 +15522,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container problem again */ if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); @@ -17552,8 +17546,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } - /* TODO(krakjoe) don't like these changes still ... anyone else ? */ - /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -18373,6 +18365,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA HANDLE_EXCEPTION(); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; + } + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -18408,7 +18420,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container problem again */ if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); @@ -22079,8 +22090,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } - /* TODO(krakjoe) don't like these changes still ... anyone else ? */ - /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -22900,6 +22909,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL HANDLE_EXCEPTION(); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; + } + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -22935,7 +22964,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container problem again */ if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); @@ -24797,8 +24825,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } - /* TODO(krakjoe) don't like these changes still ... anyone else ? */ - /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -25622,6 +25648,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; + } + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -25657,7 +25703,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container problem again */ if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); @@ -27429,8 +27474,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } - /* TODO(krakjoe) don't like these changes still ... anyone else ? */ - /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -28129,6 +28172,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST HANDLE_EXCEPTION(); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; + } + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -28236,7 +28299,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container problem again */ if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); @@ -30907,8 +30969,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } - /* TODO(krakjoe) don't like these changes still ... anyone else ? */ - /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -31607,6 +31667,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA HANDLE_EXCEPTION(); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; + } + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -31714,7 +31794,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container problem again */ if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); @@ -33324,8 +33403,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } - /* TODO(krakjoe) don't like these changes still ... anyone else ? */ - /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -34027,6 +34104,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; + } + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -34135,7 +34232,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container problem again */ if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); @@ -38045,8 +38141,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } - /* TODO(krakjoe) don't like these changes still ... anyone else ? */ - /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -39033,6 +39127,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN HANDLE_EXCEPTION(); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; + } + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -39140,7 +39254,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container problem again */ if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); @@ -44733,8 +44846,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } - /* TODO(krakjoe) don't like these changes still ... anyone else ? */ - /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -45582,6 +45693,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE HANDLE_EXCEPTION(); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; + } + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -45689,7 +45820,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container problem again */ if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); @@ -48448,8 +48578,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } - /* TODO(krakjoe) don't like these changes still ... anyone else ? */ - /* here we are sure we are dealing with an object */ if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { @@ -49301,6 +49429,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + + if (UNEXPECTED(prop_info)) { + if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { + switch ((EX(opline) + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; + } + } + } + } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -49409,7 +49557,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP HANDLE_EXCEPTION(); } - /* TODO(krakjoe) deref container problem again */ if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index d2efa13d649b..34bdcfdbf2b3 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -716,7 +716,7 @@ static void zend_persist_property_info(zval *zv) } if (prop->type_name) { - zend_accel_store_string(prop->type_name); + zend_accel_store_interned_string(prop->type_name); prop->type_ce = NULL; } From 896a4a6add387a8feb7c0f22d91e7e257c55f049 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 20 Mar 2016 06:13:45 +0000 Subject: [PATCH 091/369] just make travis run again --- Zend/zend_execute.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index dbcc43acf5d5..893e59726564 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -852,7 +852,7 @@ zend_bool zend_verify_property_type(zend_property_info *info, zval *property, ze case IS_OBJECT: if (instanceof_function(zend_ce_closure, Z_OBJCE_P(property))) return 1; - + case IS_ARRAY: if (zend_is_callable(property, IS_CALLABLE_CHECK_SILENT, NULL)) return 1; From baa0997f4c0ebc0550ddc1666679033b20ab0453 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 20 Mar 2016 16:53:47 +0000 Subject: [PATCH 092/369] the next opline always exists --- Zend/zend_vm_def.h | 40 +++-- Zend/zend_vm_execute.h | 360 +++++++++++++++++++---------------------- 2 files changed, 180 insertions(+), 220 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d7d22c8bb3e1..06adce685e33 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1985,17 +1985,15 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -2030,17 +2028,15 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 45f2eaf3b054..6be802694e55 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18325,17 +18325,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -18370,17 +18368,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -22869,17 +22865,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -22914,17 +22908,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -25608,17 +25600,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -25653,17 +25643,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -28132,17 +28120,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -28177,17 +28163,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -31627,17 +31611,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -31672,17 +31654,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -34064,17 +34044,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -34109,17 +34087,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -39087,17 +39063,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -39132,17 +39106,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -45653,17 +45625,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -45698,17 +45668,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -49389,17 +49357,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } @@ -49434,17 +49400,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - if (EXPECTED(EX(opline) + 1 < &EX(func)->op_array.opcodes[EX(func)->op_array.last])) { - switch ((EX(opline) + 1)->opcode) { - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; - } + switch ((opline + 1)->opcode) { + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } break; } } } From 888679570ec1ef1a40d6fbcc48e918dc959632c1 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 20 Mar 2016 18:05:45 +0000 Subject: [PATCH 093/369] require guard here too --- Zend/zend_vm_def.h | 8 ++++++++ Zend/zend_vm_execute.h | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 06adce685e33..da46f324fa01 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -6236,6 +6236,14 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1); zend_bool is_empty; + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { + zend_throw_exception_ex( + zend_ce_type_error, 0, + "Typed properties exist in %s: foreach by reference is disallowed", + ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + HANDLE_EXCEPTION(); + } + if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (OP1_TYPE == IS_VAR) { FREE_OP1_VAR_PTR(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6be802694e55..e59785de3916 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4311,6 +4311,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1); zend_bool is_empty; + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { + zend_throw_exception_ex( + zend_ce_type_error, 0, + "Typed properties exist in %s: foreach by reference is disallowed", + ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + HANDLE_EXCEPTION(); + } + if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (IS_CONST == IS_VAR) { @@ -13206,6 +13214,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1); zend_bool is_empty; + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { + zend_throw_exception_ex( + zend_ce_type_error, 0, + "Typed properties exist in %s: foreach by reference is disallowed", + ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + HANDLE_EXCEPTION(); + } + if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (IS_TMP_VAR == IS_VAR) { @@ -16796,6 +16812,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1); zend_bool is_empty; + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { + zend_throw_exception_ex( + zend_ce_type_error, 0, + "Typed properties exist in %s: foreach by reference is disallowed", + ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + HANDLE_EXCEPTION(); + } + if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (IS_VAR == IS_VAR) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -37069,6 +37093,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1); zend_bool is_empty; + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { + zend_throw_exception_ex( + zend_ce_type_error, 0, + "Typed properties exist in %s: foreach by reference is disallowed", + ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + HANDLE_EXCEPTION(); + } + if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (IS_CV == IS_VAR) { From 658fc85091092498a4aacb6a1b68afc3e7bb13da Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 20 Mar 2016 18:07:46 +0000 Subject: [PATCH 094/369] delay fetching iterator until after guard --- Zend/zend_vm_def.h | 4 +++- Zend/zend_vm_execute.h | 16 ++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index da46f324fa01..3dfc23850960 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -6233,7 +6233,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_class_entry *ce = Z_OBJCE_P(array_ptr); - zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1); + zend_object_iterator *iter; zend_bool is_empty; if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { @@ -6244,6 +6244,8 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) HANDLE_EXCEPTION(); } + iter = ce->get_iterator(ce, array_ptr, 1); + if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (OP1_TYPE == IS_VAR) { FREE_OP1_VAR_PTR(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index e59785de3916..2a16add7cb18 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4308,7 +4308,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_class_entry *ce = Z_OBJCE_P(array_ptr); - zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1); + zend_object_iterator *iter; zend_bool is_empty; if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { @@ -4319,6 +4319,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER HANDLE_EXCEPTION(); } + iter = ce->get_iterator(ce, array_ptr, 1); + if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (IS_CONST == IS_VAR) { @@ -13211,7 +13213,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_class_entry *ce = Z_OBJCE_P(array_ptr); - zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1); + zend_object_iterator *iter; zend_bool is_empty; if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { @@ -13222,6 +13224,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z HANDLE_EXCEPTION(); } + iter = ce->get_iterator(ce, array_ptr, 1); + if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (IS_TMP_VAR == IS_VAR) { @@ -16809,7 +16813,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_class_entry *ce = Z_OBJCE_P(array_ptr); - zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1); + zend_object_iterator *iter; zend_bool is_empty; if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { @@ -16820,6 +16824,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z HANDLE_EXCEPTION(); } + iter = ce->get_iterator(ce, array_ptr, 1); + if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (IS_VAR == IS_VAR) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -37090,7 +37096,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { zend_class_entry *ce = Z_OBJCE_P(array_ptr); - zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, 1); + zend_object_iterator *iter; zend_bool is_empty; if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { @@ -37101,6 +37107,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE HANDLE_EXCEPTION(); } + iter = ce->get_iterator(ce, array_ptr, 1); + if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (IS_CV == IS_VAR) { From 1fd296dcc1c08133b33dc65a90b0132b37dc7fd3 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 20 Mar 2016 18:22:03 +0000 Subject: [PATCH 095/369] --indentation --- Zend/zend_vm_def.h | 27 ++--- Zend/zend_vm_execute.h | 243 +++++++++++++++++++++-------------------- 2 files changed, 140 insertions(+), 130 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 3dfc23850960..d9b4cb7f708e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -742,22 +742,23 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - } else { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + break; + } - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 2a16add7cb18..d72039a82abb 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17584,22 +17584,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - } else { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + break; + } - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -22124,22 +22125,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - } else { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + break; + } - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -24855,22 +24857,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - } else { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + break; + } - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -27500,22 +27503,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - } else { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + break; + } - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -30991,22 +30995,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - } else { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + break; + } - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -33421,22 +33426,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - } else { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + break; + } - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -38165,22 +38171,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - } else { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + break; + } - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -44866,22 +44873,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - } else { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + break; + } - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } @@ -48594,22 +48602,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - } else { - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); + break; + } - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + HANDLE_EXCEPTION(); } } } From eed867aec53c5cf9f2c58b2b166f7c4ef87dc931 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 20 Mar 2016 19:28:51 +0000 Subject: [PATCH 096/369] fix return by ref --- .../typed_properties_032.phpt | 21 +++++++++++++++++++ Zend/zend_vm_def.h | 2 ++ Zend/zend_vm_execute.h | 18 ++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_032.phpt 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 000000000000..84b2823fb1cb --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_032.phpt @@ -0,0 +1,21 @@ +--TEST-- +Test typed properties return by ref is disallowed +--FILE-- +bar; + } +}; + +var_dump($foo->method()); +--EXPECTF-- +Fatal error: Uncaught TypeError: Typed property class@anonymous::$bar must not be referenced in %s:7 +Stack trace: +#0 %s(11): class@anonymous->method() +#1 {main} + thrown in %s on line 7 + diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d9b4cb7f708e..09cf835583ce 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1987,6 +1987,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -2030,6 +2031,7 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index d72039a82abb..71624c8f8551 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18357,6 +18357,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -18400,6 +18401,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -22898,6 +22900,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -22941,6 +22944,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -25634,6 +25638,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -25677,6 +25682,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -28155,6 +28161,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -28198,6 +28205,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -31647,6 +31655,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -31690,6 +31699,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -34081,6 +34091,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -34124,6 +34135,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -39111,6 +39123,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -39154,6 +39167,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -45674,6 +45688,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -45717,6 +45732,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -49407,6 +49423,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( @@ -49450,6 +49467,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { zend_throw_exception_ex( From fced0306fa4570c60c54d5429d9c8c60ffdbde6b Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 21 Mar 2016 17:30:46 +0000 Subject: [PATCH 097/369] do not allow send ref --- Zend/zend_vm_def.h | 2 ++ Zend/zend_vm_execute.h | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 09cf835583ce..8d73824fd641 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1987,6 +1987,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -2031,6 +2032,7 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 71624c8f8551..a526477ea1aa 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18357,6 +18357,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -18401,6 +18402,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -22900,6 +22902,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -22944,6 +22947,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -25638,6 +25642,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -25682,6 +25687,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -28161,6 +28167,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -28205,6 +28212,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -31655,6 +31663,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -31699,6 +31708,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -34091,6 +34101,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -34135,6 +34146,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -39123,6 +39135,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -39167,6 +39180,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -45688,6 +45702,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -45732,6 +45747,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -49423,6 +49439,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { @@ -49467,6 +49484,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA if (UNEXPECTED(prop_info)) { switch ((opline + 1)->opcode) { + case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: { From 1dfbed47157063f573f117f222f426c87752dcc1 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 21 Mar 2016 17:58:20 +0000 Subject: [PATCH 098/369] add yield by reference guard --- .../typed_properties_033.phpt | 19 +++++++ Zend/zend_vm_def.h | 6 ++- Zend/zend_vm_execute.h | 54 ++++++++++++------- 3 files changed, 59 insertions(+), 20 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_033.phpt 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 000000000000..11eaa1ac8bd1 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_033.phpt @@ -0,0 +1,19 @@ +--TEST-- +Test typed properties yield reference guard +--FILE-- +bar]; + } +}; + +foreach ($foo->fetch() as $prop); +--EXPECTF-- +Fatal error: Uncaught TypeError: Typed property class@anonymous::$bar must not be referenced in %s:6 +Stack trace: +#0 %s(10): class@anonymous->fetch() +#1 {main} + thrown in %s on line 6 diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 8d73824fd641..50ed50a5770b 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1990,7 +1990,8 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -2035,7 +2036,8 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a526477ea1aa..757733eab0d7 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18360,7 +18360,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -18405,7 +18406,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -22905,7 +22907,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -22950,7 +22953,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -25645,7 +25649,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -25690,7 +25695,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -28170,7 +28176,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -28215,7 +28222,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -31666,7 +31674,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -31711,7 +31720,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -34104,7 +34114,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -34149,7 +34160,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -39138,7 +39150,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -39183,7 +39196,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -45705,7 +45719,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -45750,7 +45765,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -49442,7 +49458,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", @@ -49487,7 +49504,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: { + case ZEND_INIT_ARRAY: + case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", From b1543e5aae335ec7ef151970d6ad458416b5d06c Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 21 Mar 2016 19:10:56 +0000 Subject: [PATCH 099/369] guard add array element --- .../typed_properties_034.phpt | 24 +++++++++++++++++++ Zend/zend_vm_def.h | 3 ++- Zend/zend_vm_execute.h | 9 +++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_034.phpt 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 000000000000..64a6c5d8deaa --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_034.phpt @@ -0,0 +1,24 @@ +--TEST-- +Test typed properties add array element guard +--FILE-- +bar] as $item) + { + yield $item; + } + } +}; + +foreach($foo->getIterator() as $item); +--EXPECTF-- +Fatal error: Uncaught TypeError: Typed property class@anonymous::$bar must not be referenced in %s:8 +Stack trace: +#0 %s(15): class@anonymous->getIterator() +#1 {main} + thrown in %s on line 8 diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 50ed50a5770b..580ffb7b0cb3 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1990,7 +1990,8 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: + case ZEND_INIT_ARRAY: + case ZEND_ADD_ARRAY_ELEMENT: case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 757733eab0d7..24622a3b650d 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18361,6 +18361,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: + case ZEND_ADD_ARRAY_ELEMENT: case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, @@ -22908,6 +22909,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: + case ZEND_ADD_ARRAY_ELEMENT: case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, @@ -25650,6 +25652,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: + case ZEND_ADD_ARRAY_ELEMENT: case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, @@ -28177,6 +28180,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: + case ZEND_ADD_ARRAY_ELEMENT: case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, @@ -31675,6 +31679,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: + case ZEND_ADD_ARRAY_ELEMENT: case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, @@ -34115,6 +34120,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: + case ZEND_ADD_ARRAY_ELEMENT: case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, @@ -39151,6 +39157,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: + case ZEND_ADD_ARRAY_ELEMENT: case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, @@ -45720,6 +45727,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: + case ZEND_ADD_ARRAY_ELEMENT: case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, @@ -49459,6 +49467,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: case ZEND_INIT_ARRAY: + case ZEND_ADD_ARRAY_ELEMENT: case ZEND_YIELD: { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, From 3a057cbe9a32416a0bd84da50bfbe0e9b3020997 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 21 Mar 2016 20:25:41 +0000 Subject: [PATCH 100/369] use api for stuff ... doh --- Zend/zend_execute.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index f6b8ff97ec1c..3289e6b5058f 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -782,10 +782,9 @@ zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *pro } if (EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *info = zend_hash_find_ptr( - &Z_OBJCE_P(object)->properties_info, Z_STR_P(property)); + zend_property_info *info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); - if (UNEXPECTED(info && info->type)) { + if (UNEXPECTED(info && info != ZEND_WRONG_PROPERTY_INFO && info->type)) { return info; } } From bc450bb21bf30009b492f0eb43c55c867a63547c Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 21 Mar 2016 20:38:24 +0000 Subject: [PATCH 101/369] inheritance fixes --- .../typed_properties_035.phpt | 14 +++++ Zend/zend_inheritance.c | 52 +++++++++++-------- 2 files changed, 44 insertions(+), 22 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_035.phpt 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 000000000000..3ad55e2bcf43 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_035.phpt @@ -0,0 +1,14 @@ +--TEST-- +Test typed properties inheritance must not change type +--FILE-- +type && !(parent_info->flags & ZEND_ACC_PRIVATE))) { - if (parent_info->type == IS_OBJECT) { - if (child_info->type != IS_OBJECT || - !zend_string_equals_ci(zend_resolve_property_type(parent_info->type_name, parent_info->ce), - zend_resolve_property_type(child_info->type_name, child_info->ce))) { - zend_error_noreturn(E_COMPILE_ERROR, - "Type of %s::$%s must be %s (as in class %s)", - ZSTR_VAL(ce->name), - ZSTR_VAL(key), - ZSTR_VAL(zend_resolve_property_type(parent_info->type_name, parent_info->ce)), - ZSTR_VAL(ce->parent->name)); - } - } else if (parent_info->type != child_info->type) { - zend_error_noreturn(E_COMPILE_ERROR, - "Type of %s::$%s must be %s (as in class %s)", - ZSTR_VAL(ce->name), - ZSTR_VAL(key), - zend_get_type_by_const(parent_info->type), - ZSTR_VAL(ce->parent->name)); - } - } if (UNEXPECTED(parent_info->flags & (ZEND_ACC_PRIVATE|ZEND_ACC_SHADOW))) { child_info->flags |= ZEND_ACC_CHANGED; @@ -698,6 +676,36 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke child_info->offset = parent_info->offset; } } + + if (!(child_info->flags & ZEND_ACC_CHANGED)) { + if (UNEXPECTED(parent_info->type && !(parent_info->flags & ZEND_ACC_PRIVATE))) { + if (parent_info->type == IS_OBJECT) { + if (child_info->type != IS_OBJECT || + !zend_string_equals_ci(zend_resolve_property_type(parent_info->type_name, parent_info->ce), + zend_resolve_property_type(child_info->type_name, child_info->ce))) { + zend_error_noreturn(E_COMPILE_ERROR, + "Type of %s::$%s must be %s (as in class %s)", + ZSTR_VAL(ce->name), + ZSTR_VAL(key), + ZSTR_VAL(zend_resolve_property_type(parent_info->type_name, parent_info->ce)), + ZSTR_VAL(ce->parent->name)); + } + } else if (parent_info->type != child_info->type) { + zend_error_noreturn(E_COMPILE_ERROR, + "Type of %s::$%s must be %s (as in class %s)", + ZSTR_VAL(ce->name), + ZSTR_VAL(key), + zend_get_type_by_const(parent_info->type), + ZSTR_VAL(ce->parent->name)); + } + } else if (UNEXPECTED(child_info->type && !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->type && !(parent_info->flags & ZEND_ACC_PRIVATE))) { if (parent_info->type == IS_OBJECT) { From 8a8d97a699ac2508a94bdb9dd9b0b840a47c512d Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 22 Mar 2016 14:34:09 +0000 Subject: [PATCH 102/369] woops --- Zend/zend_execute.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 3289e6b5058f..d122ebadfa00 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -820,7 +820,7 @@ zend_bool zend_verify_property_type(zend_property_info *info, zval *property, ze info->type_ce = zend_lookup_class(resolved); } - if (Z_TYPE_P(property) != IS_OBJECT || !instanceof_function(info->type_ce, Z_OBJCE_P(property))) { + if (Z_TYPE_P(property) != IS_OBJECT || !instanceof_function(Z_OBJCE_P(property), info->type_ce)) { zend_throw_exception_ex(zend_ce_type_error, info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(info->ce->name), From be570b075dc074945e49e57361ae8586a9dda8b6 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Thu, 24 Mar 2016 06:37:16 +0000 Subject: [PATCH 103/369] separate proeprty type verification and error routine, fix display of private member names --- Zend/zend_execute.c | 44 +++++++++++-------- Zend/zend_execute.h | 1 + Zend/zend_vm_def.h | 7 +++ Zend/zend_vm_execute.h | 96 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 130 insertions(+), 18 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index d122ebadfa00..5b390627da5f 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -811,24 +811,40 @@ static inline zend_bool zend_verify_scalar_property_type(zend_uchar type, zval * return ZEND_SAME_FAKE_TYPE(type, Z_TYPE_P(property)); } +void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property) { + zend_string *resolved = zend_resolve_property_type(info->type_name, info->ce); + + if (info->type == IS_OBJECT) { + zend_throw_exception_ex(zend_ce_type_error, info->type, + "Typed property %s::$%s must be an instance of %s, %s used", + ZSTR_VAL(info->ce->name), + ZSTR_VAL(name), + ZSTR_VAL(resolved), + Z_TYPE_P(property) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(property)->name) : + zend_get_type_by_const(Z_TYPE_P(property))); + } else { + zend_throw_exception_ex(zend_ce_type_error, info->type, + "Typed property %s::$%s must be %s, %s used", + ZSTR_VAL(info->ce->name), + ZSTR_VAL(name), + zend_get_type_by_const(info->type), + Z_TYPE_P(property) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(property)->name) : + zend_get_type_by_const(Z_TYPE_P(property))); + } +} + zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) { switch (info->type) { case IS_OBJECT: { zend_string *resolved = zend_resolve_property_type(info->type_name, info->ce); - + if (!info->type_ce) { info->type_ce = zend_lookup_class(resolved); } - if (Z_TYPE_P(property) != IS_OBJECT || !instanceof_function(Z_OBJCE_P(property), info->type_ce)) { - zend_throw_exception_ex(zend_ce_type_error, info->type, - "Typed property %s::$%s must be an instance of %s, %s used", - ZSTR_VAL(info->ce->name), - ZSTR_VAL(info->name), - ZSTR_VAL(resolved), - Z_TYPE_P(property) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(property)->name) : - zend_get_type_by_const(Z_TYPE_P(property))); + if (!info->type_ce || Z_TYPE_P(property) != IS_OBJECT || !instanceof_function(Z_OBJCE_P(property), info->type_ce)) { return 0; } return 1; @@ -846,14 +862,6 @@ zend_bool zend_verify_property_type(zend_property_info *info, zval *property, ze default: if (!zend_verify_scalar_property_type(info->type, property, strict)) { - zend_throw_exception_ex(zend_ce_type_error, info->type, - "Typed property %s::$%s must be %s, %s used", - ZSTR_VAL(info->ce->name), - ZSTR_VAL(info->name), - zend_get_type_by_const(info->type), - Z_TYPE_P(property) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(property)->name) : - zend_get_type_by_const(Z_TYPE_P(property))); return 0; } return 1; diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index ed61d6f8cbb3..e5c136c44388 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -384,6 +384,7 @@ static zend_always_inline zend_bool _zend_object_has_type_hints(zval *object) { zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *property, void **cache); zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict); +void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property); END_EXTERN_C() diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 580ffb7b0cb3..36fdf2fb4fa4 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -758,6 +758,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -776,6 +777,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); HANDLE_EXCEPTION(); } } @@ -1183,6 +1185,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -1205,6 +1208,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -1294,6 +1298,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -1954,6 +1959,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -2414,6 +2420,7 @@ ZEND_VM_C_LABEL(fast_assign_obj): if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 24622a3b650d..87c9b1c5c7e1 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5648,6 +5648,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -9437,6 +9438,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -11278,6 +11280,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -13696,6 +13699,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -14950,6 +14954,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -15505,6 +15510,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -17600,6 +17606,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -17618,6 +17625,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); HANDLE_EXCEPTION(); } } @@ -18023,6 +18031,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -18045,6 +18054,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -18133,6 +18143,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -18324,6 +18335,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -18667,6 +18679,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -18852,6 +18865,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -19037,6 +19051,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -19222,6 +19237,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -22148,6 +22164,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -22166,6 +22183,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); HANDLE_EXCEPTION(); } } @@ -22571,6 +22589,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -22593,6 +22612,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -22681,6 +22701,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -22872,6 +22893,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -23215,6 +23237,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -23400,6 +23423,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -23585,6 +23609,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -23770,6 +23795,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -24887,6 +24913,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -24905,6 +24932,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); HANDLE_EXCEPTION(); } } @@ -25312,6 +25340,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -25334,6 +25363,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -25423,6 +25453,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -25615,6 +25646,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -25958,6 +25990,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -26143,6 +26176,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -26328,6 +26362,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -26513,6 +26548,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -27540,6 +27576,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -27558,6 +27595,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); HANDLE_EXCEPTION(); } } @@ -27933,6 +27971,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -27955,6 +27994,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -28043,6 +28083,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -28143,6 +28184,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -28558,6 +28600,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -28743,6 +28786,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -28928,6 +28972,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -29113,6 +29158,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -31039,6 +31085,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -31057,6 +31104,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); HANDLE_EXCEPTION(); } } @@ -31432,6 +31480,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -31454,6 +31503,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -31542,6 +31592,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -31642,6 +31693,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -32057,6 +32109,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -32242,6 +32295,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -32427,6 +32481,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -32612,6 +32667,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -33477,6 +33533,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -33495,6 +33552,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); HANDLE_EXCEPTION(); } } @@ -33871,6 +33929,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -33893,6 +33952,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -33982,6 +34042,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -34083,6 +34144,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -34499,6 +34561,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -34684,6 +34747,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -34869,6 +34933,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -35054,6 +35119,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -38229,6 +38295,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -38247,6 +38314,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); HANDLE_EXCEPTION(); } } @@ -38652,6 +38720,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -38674,6 +38743,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -38762,6 +38832,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -39120,6 +39191,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -39579,6 +39651,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -39764,6 +39837,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -39949,6 +40023,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -40134,6 +40209,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -44938,6 +45014,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -44956,6 +45033,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); HANDLE_EXCEPTION(); } } @@ -45361,6 +45439,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -45383,6 +45462,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -45471,6 +45551,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -45690,6 +45771,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -46105,6 +46187,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -46290,6 +46373,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -46475,6 +46559,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -46660,6 +46745,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -48674,6 +48760,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -48692,6 +48779,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); HANDLE_EXCEPTION(); } } @@ -49099,6 +49187,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); HANDLE_EXCEPTION(); } } @@ -49121,6 +49210,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -49210,6 +49300,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -49430,6 +49521,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } } @@ -49846,6 +49938,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -50031,6 +50124,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -50216,6 +50310,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } @@ -50401,6 +50496,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } } From 4f1b2e17a4d4e29735076061e5e88fc73cabe5f8 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 30 Mar 2016 06:02:08 +0100 Subject: [PATCH 104/369] better detection --- Zend/zend_execute.c | 23 +++ Zend/zend_vm_def.h | 37 ++--- Zend/zend_vm_execute.h | 333 +++++++++++++---------------------------- 3 files changed, 143 insertions(+), 250 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 5b390627da5f..cccd82edfdb1 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -177,6 +177,29 @@ ZEND_API void* zend_vm_stack_extend(size_t size) return ptr; } +zend_bool zend_vm_is_fetching_reference(const zend_op * opline) { + zend_op const *next = opline + 1; + + while (next->opcode == ZEND_NOP || + next->opcode == ZEND_TICKS || + next->opcode == ZEND_EXT_NOP || + next->opcode == ZEND_EXT_STMT) + next++; + + switch (next->opcode) { + case ZEND_SEND_REF: + case ZEND_RETURN_BY_REF: + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: + case ZEND_ADD_ARRAY_ELEMENT: + case ZEND_YIELD: { + return 1; + } break; + } + + return 0; +} + ZEND_API zval* zend_get_compiled_variable_value(const zend_execute_data *execute_data, uint32_t var) { return EX_VAR(var); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 17443f246a91..8629badad9f4 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1992,19 +1992,12 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_ADD_ARRAY_ELEMENT: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -2039,18 +2032,12 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 22fa55ca4f84..34284339d59c 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18640,19 +18640,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_ADD_ARRAY_ELEMENT: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -18687,18 +18680,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -23198,19 +23185,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_ADD_ARRAY_ELEMENT: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -23245,18 +23225,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -25951,19 +25925,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_ADD_ARRAY_ELEMENT: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -25998,18 +25965,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -28499,19 +28460,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_ADD_ARRAY_ELEMENT: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -28546,18 +28500,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -32008,19 +31956,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_ADD_ARRAY_ELEMENT: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -32055,18 +31996,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -34459,19 +34394,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_ADD_ARRAY_ELEMENT: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -34506,18 +34434,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -39506,19 +39428,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_ADD_ARRAY_ELEMENT: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -39553,18 +39468,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -46137,19 +46046,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_ADD_ARRAY_ELEMENT: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -46184,18 +46086,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -49982,19 +49878,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_ADD_ARRAY_ELEMENT: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } @@ -50029,18 +49918,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); if (UNEXPECTED(prop_info)) { - switch ((opline + 1)->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_YIELD: { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } break; + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } } From e48ecd83afc3e300c67ced8343a97a2167a5e7b2 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 30 Mar 2016 13:08:57 +0100 Subject: [PATCH 105/369] caches and things ... Thanks Dmitry :) --- Zend/zend_compile.c | 14 +- Zend/zend_execute.c | 9 +- Zend/zend_object_handlers.c | 2 + Zend/zend_vm_def.h | 20 +- Zend/zend_vm_execute.h | 258 +++++++++++------------ ext/opcache/Optimizer/compact_literals.c | 6 +- ext/opcache/Optimizer/zend_optimizer.c | 6 +- 7 files changed, 164 insertions(+), 151 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 0876b0a1988f..a000c4a0ecd1 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -70,12 +70,18 @@ static inline void zend_alloc_cache_slot(uint32_t literal) { op_array->cache_size += sizeof(void*); } -#define POLYMORPHIC_CACHE_SLOT_SIZE 2 +#define POLYMORPHIC_CACHE_SLOTS_COUNT 1 /* only one class */ static inline void zend_alloc_polymorphic_cache_slot(uint32_t literal) { zend_op_array *op_array = CG(active_op_array); Z_CACHE_SLOT(op_array->literals[literal]) = op_array->cache_size; - op_array->cache_size += POLYMORPHIC_CACHE_SLOT_SIZE * sizeof(void*); + op_array->cache_size += POLYMORPHIC_CACHE_SLOTS_COUNT * sizeof(void*) * 2; +} + +static inline void zend_alloc_polymorphic_cache_slots(uint32_t literal, int count) { + zend_op_array *op_array = CG(active_op_array); + Z_CACHE_SLOT(op_array->literals[literal]) = op_array->cache_size; + op_array->cache_size += POLYMORPHIC_CACHE_SLOTS_COUNT * sizeof(void*) * (1 + count); } ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type); @@ -2647,7 +2653,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)); - zend_alloc_polymorphic_cache_slot(opline->op2.constant); + zend_alloc_polymorphic_cache_slots(opline->op2.constant, 2); } return opline; @@ -2688,7 +2694,7 @@ zend_op *zend_compile_static_prop_common(znode *result, zend_ast *ast, uint32_t } if (opline->op1_type == IS_CONST) { convert_to_string(CT_CONSTANT(opline->op1)); - zend_alloc_polymorphic_cache_slot(opline->op1.constant); + zend_alloc_polymorphic_cache_slots(opline->op1.constant, 2); } if (class_node.op_type == IS_CONST) { opline->op2_type = IS_CONST; diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index cccd82edfdb1..24fbd3fc12c7 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -787,8 +787,13 @@ static int zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, zv return 1; } -zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *property, void **cache) { - /* TODO(krakjoe) use cache */ +zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *property, void **cache_slot) +{ + if (cache_slot && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR_EX(cache_slot))) { + zend_property_info *info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + + return (info && info->type) ? info : NULL; + } do { if (UNEXPECTED(Z_TYPE_P(property) != IS_STRING)) { break; diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 62b26d694421..a17e911e5e20 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -360,6 +360,7 @@ static zend_always_inline uint32_t zend_get_property_offset(zend_class_entry *ce exit_dynamic: if (cache_slot) { CACHE_POLYMORPHIC_PTR_EX(cache_slot, ce, (void*)(intptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET); + CACHE_PTR_EX(cache_slot + 2, NULL); } return ZEND_DYNAMIC_PROPERTY_OFFSET; } else if (UNEXPECTED(property_info == ZEND_WRONG_PROPERTY_INFO)) { @@ -373,6 +374,7 @@ static zend_always_inline uint32_t zend_get_property_offset(zend_class_entry *ce exit: if (cache_slot) { CACHE_POLYMORPHIC_PTR_EX(cache_slot, ce, (void*)(intptr_t)property_info->offset); + CACHE_PTR_EX(cache_slot + 2, property_info); } return property_info->offset; } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 8629badad9f4..0e45b8fa1b00 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -754,7 +754,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -773,7 +773,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_assign_op_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { @@ -1181,7 +1181,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -1204,7 +1204,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_pre_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -1294,7 +1294,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -1949,7 +1949,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): } while (0); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { @@ -1989,7 +1989,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -2029,7 +2029,7 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -2151,7 +2151,7 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { zend_throw_exception_ex( @@ -2454,7 +2454,7 @@ ZEND_VM_C_LABEL(fast_assign_obj): } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 34284339d59c..c44587c7dec3 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5659,7 +5659,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H } while (0); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { @@ -5780,7 +5780,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { zend_throw_exception_ex( @@ -9500,7 +9500,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND } while (0); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { @@ -9621,7 +9621,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { zend_throw_exception_ex( @@ -11437,7 +11437,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ } while (0); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { @@ -11559,7 +11559,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { zend_throw_exception_ex( @@ -13951,7 +13951,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN } while (0); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { @@ -14000,7 +14000,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { zend_throw_exception_ex( @@ -15206,7 +15206,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE } while (0); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { @@ -15255,7 +15255,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { zend_throw_exception_ex( @@ -15762,7 +15762,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA } while (0); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { @@ -15811,7 +15811,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { zend_throw_exception_ex( @@ -17874,7 +17874,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -17893,7 +17893,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { @@ -18299,7 +18299,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -18322,7 +18322,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -18411,7 +18411,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -18597,7 +18597,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN } while (0); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { @@ -18637,7 +18637,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -18677,7 +18677,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -18726,7 +18726,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { zend_throw_exception_ex( @@ -18934,7 +18934,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -19120,7 +19120,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -19306,7 +19306,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -19492,7 +19492,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -22419,7 +22419,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -22438,7 +22438,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { @@ -22844,7 +22844,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -22867,7 +22867,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -22956,7 +22956,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -23142,7 +23142,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE } while (0); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { @@ -23182,7 +23182,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -23222,7 +23222,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -23271,7 +23271,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { zend_throw_exception_ex( @@ -23479,7 +23479,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -23665,7 +23665,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -23851,7 +23851,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -24037,7 +24037,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -25155,7 +25155,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -25174,7 +25174,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { @@ -25582,7 +25582,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -25605,7 +25605,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -25695,7 +25695,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -25882,7 +25882,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA } while (0); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { @@ -25922,7 +25922,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -25962,7 +25962,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -26011,7 +26011,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { zend_throw_exception_ex( @@ -26219,7 +26219,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -26405,7 +26405,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -26591,7 +26591,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -26777,7 +26777,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -27815,7 +27815,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -27834,7 +27834,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { @@ -28210,7 +28210,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -28233,7 +28233,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -28322,7 +28322,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -28417,7 +28417,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ } while (0); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { @@ -28457,7 +28457,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -28497,7 +28497,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -28618,7 +28618,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { zend_throw_exception_ex( @@ -28826,7 +28826,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -29012,7 +29012,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -29198,7 +29198,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -29384,7 +29384,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -31311,7 +31311,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -31330,7 +31330,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { @@ -31706,7 +31706,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -31729,7 +31729,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -31818,7 +31818,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -31913,7 +31913,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN } while (0); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { @@ -31953,7 +31953,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -31993,7 +31993,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -32114,7 +32114,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { zend_throw_exception_ex( @@ -32322,7 +32322,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -32508,7 +32508,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -32694,7 +32694,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -32880,7 +32880,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -33746,7 +33746,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -33765,7 +33765,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { @@ -34142,7 +34142,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -34165,7 +34165,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -34255,7 +34255,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -34351,7 +34351,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR } while (0); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { @@ -34391,7 +34391,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -34431,7 +34431,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -34553,7 +34553,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { zend_throw_exception_ex( @@ -34761,7 +34761,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -34947,7 +34947,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -35133,7 +35133,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -35319,7 +35319,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -38495,7 +38495,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -38514,7 +38514,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { @@ -38920,7 +38920,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -38943,7 +38943,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -39032,7 +39032,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -39385,7 +39385,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND } while (0); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { @@ -39425,7 +39425,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -39465,7 +39465,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -39586,7 +39586,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { zend_throw_exception_ex( @@ -39889,7 +39889,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -40075,7 +40075,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -40261,7 +40261,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -40447,7 +40447,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -45252,7 +45252,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -45271,7 +45271,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { @@ -45677,7 +45677,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -45700,7 +45700,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -45789,7 +45789,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -46003,7 +46003,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER } while (0); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { @@ -46043,7 +46043,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -46083,7 +46083,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -46204,7 +46204,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { zend_throw_exception_ex( @@ -46507,7 +46507,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -46693,7 +46693,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -46879,7 +46879,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -47065,7 +47065,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -49080,7 +49080,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -49099,7 +49099,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { @@ -49507,7 +49507,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { @@ -49530,7 +49530,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -49620,7 +49620,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { @@ -49835,7 +49835,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN } while (0); if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { @@ -49875,7 +49875,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -49915,7 +49915,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { if (zend_vm_is_fetching_reference(opline)) { @@ -50037,7 +50037,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (prop_info) { zend_throw_exception_ex( @@ -50340,7 +50340,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -50526,7 +50526,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -50712,7 +50712,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { @@ -50898,7 +50898,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, NULL); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index 76c89fe828c3..ace0e8714b59 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -212,7 +212,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx opline->op2_type, opline->op2, opline->op1.constant, - LITERAL_STATIC_PROPERTY, 2, 1, + LITERAL_STATIC_PROPERTY, 3, 1, op_array); } break; @@ -248,7 +248,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx opline->op1_type, opline->op1, opline->op2.constant, - LITERAL_PROPERTY, 2, 1, + LITERAL_PROPERTY, 3, 1, op_array); } break; @@ -271,7 +271,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx opline->op1_type, opline->op1, opline->op2.constant, - LITERAL_PROPERTY, 2, 1, + LITERAL_PROPERTY, 3, 1, op_array); } else { LITERAL_INFO(opline->op2.constant, LITERAL_VALUE, 1, 0, 1); diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 42c608416f0d..2ace91b0318f 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -189,7 +189,7 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, case ZEND_FETCH_STATIC_PROP_FUNC_ARG: TO_STRING_NOWARN(val); opline->op1.constant = zend_optimizer_add_literal(op_array, val); - alloc_cache_slots_op1(op_array, opline, 2); + alloc_cache_slots_op1(op_array, opline, 3); break; case ZEND_CONCAT: case ZEND_FAST_CONCAT: @@ -286,7 +286,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, case ZEND_ISSET_ISEMPTY_PROP_OBJ: TO_STRING_NOWARN(val); opline->op2.constant = zend_optimizer_add_literal(op_array, val); - alloc_cache_slots_op2(op_array, opline, 2); + alloc_cache_slots_op2(op_array, opline, 3); break; case ZEND_ASSIGN_ADD: case ZEND_ASSIGN_SUB: @@ -303,7 +303,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, if (opline->extended_value == ZEND_ASSIGN_OBJ) { TO_STRING_NOWARN(val); opline->op2.constant = zend_optimizer_add_literal(op_array, val); - alloc_cache_slots_op2(op_array, opline, 2); + alloc_cache_slots_op2(op_array, opline, 3); } else { opline->op2.constant = zend_optimizer_add_literal(op_array, val); } From efe506a9de5695fd684dc733b91002d6bb9cb613 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 30 Mar 2016 14:59:08 +0100 Subject: [PATCH 106/369] fix foreach, possibly ... --- .../typed_properties_036.phpt | 20 ++++++++++++++ Zend/zend_execute.c | 27 ++++++++++++++----- Zend/zend_execute.h | 1 + Zend/zend_vm_def.h | 15 +++++++++++ Zend/zend_vm_execute.h | 15 +++++++++++ 5 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_036.phpt 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 000000000000..5ae25d6c9826 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_036.phpt @@ -0,0 +1,20 @@ +--TEST-- +Test typed properties normal foreach must not yield null +--FILE-- + $bar) + var_dump($key, $bar); +--EXPECTF-- +string(3) "bar" +int(10) + +Fatal error: Uncaught TypeError: Typed property class@anonymous::$qux must not be accessed before initialization in %s:7 +Stack trace: +#0 {main} + thrown in %s on line 7 + diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 24fbd3fc12c7..70eca4941e48 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -787,6 +787,24 @@ static int zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, zv return 1; } +zend_property_info* zend_object_fetch_property_type_info_ex(zval *object, zend_string *property, void **cache_slot) { + zend_property_info *info = NULL; + + if (cache_slot && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR_EX(cache_slot))) { + zend_property_info *cached = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + + return (cached && cached->type) ? cached : NULL; + } + + info = zend_get_property_info(Z_OBJCE_P(object), property, 1); + + if (UNEXPECTED(info && info != ZEND_WRONG_PROPERTY_INFO && info->type)) { + return info; + } + + return NULL; +} + zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *property, void **cache_slot) { if (cache_slot && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR_EX(cache_slot))) { @@ -794,6 +812,7 @@ zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *pro return (info && info->type) ? info : NULL; } + do { if (UNEXPECTED(Z_TYPE_P(property) != IS_STRING)) { break; @@ -809,13 +828,7 @@ zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *pro } } - if (EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); - - if (UNEXPECTED(info && info != ZEND_WRONG_PROPERTY_INFO && info->type)) { - return info; - } - } + return zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); } while (0); return NULL; diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index e5c136c44388..28889c35b730 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -383,6 +383,7 @@ static zend_always_inline zend_bool _zend_object_has_type_hints(zval *object) { #define ZEND_OBJECT_HAS_TYPE_HINTS(object) _zend_object_has_type_hints(object) zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *property, void **cache); +zend_property_info* zend_object_fetch_property_type_info_ex(zval *object, zend_string *property, void **cache); zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict); void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 0e45b8fa1b00..51a1e835d5ad 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -6459,6 +6459,21 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR) pos++; p++; } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array) && p->key)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(array, p->key, NULL); + + if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(Z_TYPE_P(value) == IS_NULL)) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + ZSTR_VAL(p->key)); + HANDLE_EXCEPTION(); + } + } + } + if (opline->result_type & (IS_TMP_VAR|IS_CV)) { if (UNEXPECTED(!p->key)) { ZVAL_LONG(EX_VAR(opline->result.var), p->h); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index c44587c7dec3..c4270b0bde01 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17254,6 +17254,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE pos++; p++; } + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array) && p->key)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(array, p->key, NULL); + + if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(Z_TYPE_P(value) == IS_NULL)) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + ZSTR_VAL(p->key)); + HANDLE_EXCEPTION(); + } + } + } + if (opline->result_type & (IS_TMP_VAR|IS_CV)) { if (UNEXPECTED(!p->key)) { ZVAL_LONG(EX_VAR(opline->result.var), p->h); From c6eb6d25ad2611b419a17f125a0be7259d248669 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 4 Apr 2016 23:54:22 +0100 Subject: [PATCH 107/369] fix foreach clean non persistent type info --- Zend/zend_execute.h | 4 +++- Zend/zend_execute_API.c | 22 ++++++++++++++++++++++ Zend/zend_vm_def.h | 3 +++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 28889c35b730..c0ff23dd0eeb 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -362,6 +362,8 @@ void zend_cleanup_unfinished_execution(zend_execute_data *execute_data, uint32_t } \ } while (0) +#define ZEND_CLASS_HAS_TYPE_HINTS(ce) ((ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) == ZEND_ACC_HAS_TYPE_HINTS) + static zend_always_inline zend_bool _zend_object_has_type_hints(zval *object) { do { if (Z_TYPE_P(object) != IS_OBJECT) { @@ -374,7 +376,7 @@ static zend_always_inline zend_bool _zend_object_has_type_hints(zval *object) { } } - return (Z_OBJCE_P(object)->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) == ZEND_ACC_HAS_TYPE_HINTS; + return ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)); } while (0); return 0; diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index dc2ce46a7b90..99c6475d4a56 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -111,6 +111,25 @@ ZEND_API int clean_non_persistent_function_full(zval *zv) /* {{{ */ } /* }}} */ +static int clean_non_persistent_type_info(zval *zv) /* {{{ */ +{ + zend_class_entry *ce = Z_PTR_P(zv); + + if (UNEXPECTED(ce->type == ZEND_INTERNAL_CLASS)) { + if (ZEND_CLASS_HAS_TYPE_HINTS(ce)) { + zend_property_info *prop_info; + ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) { + if (prop_info->type_ce->type == ZEND_USER_CLASS) { + prop_info->type_ce = NULL; + } + } ZEND_HASH_FOREACH_END(); + } + return ZEND_HASH_APPLY_KEEP; + } + + return ZEND_HASH_APPLY_STOP; +} /* }}} */ + static int clean_non_persistent_class(zval *zv) /* {{{ */ { zend_class_entry *ce = Z_PTR_P(zv); @@ -358,6 +377,9 @@ void shutdown_executor(void) /* {{{ */ zend_vm_stack_destroy(); + /* remove non persistent type info from internal classes */ + zend_hash_apply(EG(class_table), clean_non_persistent_type_info); + /* Destroy all op arrays */ if (EG(full_tables_cleanup)) { zend_hash_reverse_apply(EG(function_table), clean_non_persistent_function_full); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 51a1e835d5ad..e03afc10e1e7 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -6470,6 +6470,9 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR) ZSTR_VAL(prop_info->ce->name), ZSTR_VAL(p->key)); HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, p->key, value); + HANDLE_EXCEPTION(); } } } From cce2414b4b1ba23a0d73ed38336d15dbe3b1335b Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 5 Apr 2016 00:42:15 +0100 Subject: [PATCH 108/369] change decl groups --- .../typed_properties_018.phpt | 10 ++++- .../typed_properties_025.phpt | 5 ++- .../typed_properties_036.phpt | 7 ++-- Zend/zend_ast.c | 25 +++++++++---- Zend/zend_ast.h | 5 ++- Zend/zend_compile.c | 37 ++++++++----------- Zend/zend_language_parser.y | 13 ++++--- 7 files changed, 56 insertions(+), 46 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_018.phpt b/Zend/tests/type_declarations/typed_properties_018.phpt index f60525536f38..54fd38dc9164 100644 --- a/Zend/tests/type_declarations/typed_properties_018.phpt +++ b/Zend/tests/type_declarations/typed_properties_018.phpt @@ -1,14 +1,20 @@ --TEST-- -Test typed properties disallow mixing typed and untyped declarations +Test typed properties type applies to all props in group --FILE-- getProperty("qux"); + +var_dump((string) $prop->getType()); ?> --EXPECTF-- -Fatal error: Untyped property Foo::$qux must not be mixed with typed properties in %s on line 3 +string(3) "int" diff --git a/Zend/tests/type_declarations/typed_properties_025.phpt b/Zend/tests/type_declarations/typed_properties_025.phpt index 7979a33898e6..70156de35b8f 100644 --- a/Zend/tests/type_declarations/typed_properties_025.phpt +++ b/Zend/tests/type_declarations/typed_properties_025.phpt @@ -1,5 +1,5 @@ --TEST-- -Test typed properties disallow mixing typed and untyped declarations +Test typed properties type must preceed first declaration in group --FILE-- --EXPECTF-- -Fatal error: Typed property Foo::$qux must not be mixed with untyped properties in %s on line 3 +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_036.phpt b/Zend/tests/type_declarations/typed_properties_036.phpt index 5ae25d6c9826..4048e370f368 100644 --- a/Zend/tests/type_declarations/typed_properties_036.phpt +++ b/Zend/tests/type_declarations/typed_properties_036.phpt @@ -3,8 +3,7 @@ Test typed properties normal foreach must not yield null --FILE-- $bar) @@ -13,8 +12,8 @@ foreach ($foo as $key => $bar) string(3) "bar" int(10) -Fatal error: Uncaught TypeError: Typed property class@anonymous::$qux must not be accessed before initialization in %s:7 +Fatal error: Uncaught TypeError: Typed property class@anonymous::$qux must not be accessed before initialization in %s:6 Stack trace: #0 {main} - thrown in %s on line 7 + thrown in %s on line 6 diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 3b9356461b98..cb1569910625 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -1100,7 +1100,12 @@ static void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int 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]; + + ast = prop_ast; + if (ast->attr & ZEND_ACC_PUBLIC) { smart_str_appends(str, "public "); } else if (ast->attr & ZEND_ACC_PROTECTED) { @@ -1111,7 +1116,16 @@ static void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int if (ast->attr & ZEND_ACC_STATIC) { smart_str_appends(str, "static "); } + + if (type_ast) { + zend_ast_export_name( + str, type_ast, 0, indent); + smart_str_appendc(str, ' '); + } + goto simple_list; + } + case ZEND_AST_CONST_DECL: case ZEND_AST_CLASS_CONST_DECL: smart_str_appends(str, "const "); @@ -1437,14 +1451,9 @@ static void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int } break; case ZEND_AST_PROP_ELEM: - if (ast->child[0]) { - zend_ast_export_name( - str, ast->child[0], 0, indent); - smart_str_appendc(str, ' '); - } smart_str_appendc(str, '$'); - zend_ast_export_name(str, ast->child[1], 0, indent); - APPEND_DEFAULT_VALUE(2); + zend_ast_export_name(str, ast->child[0], 0, indent); + APPEND_DEFAULT_VALUE(1); case ZEND_AST_CONST_ELEM: zend_ast_export_name(str, ast->child[0], 0, indent); APPEND_DEFAULT_VALUE(1); diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index 05a0c29dc451..494334411211 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -131,6 +131,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, @@ -141,11 +142,11 @@ enum _zend_ast_kind { ZEND_AST_CATCH, ZEND_AST_PARAM, ZEND_AST_CONST_ELEM, + ZEND_AST_PROP_ELEM, /* 4 child nodes */ ZEND_AST_FOR = 4 << ZEND_AST_NUM_CHILDREN_SHIFT, - ZEND_AST_FOREACH, - ZEND_AST_PROP_ELEM, + ZEND_AST_FOREACH }; typedef uint16_t zend_ast_kind; diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index a000c4a0ecd1..99ea72a8d7e6 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5378,13 +5378,12 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) /* {{{ */ } /* }}} */ -void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ +void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ { 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; - zend_bool use_optional_types = 0; if (ce->ce_flags & ZEND_ACC_INTERFACE) { zend_error_noreturn(E_COMPILE_ERROR, "Interfaces may not include member variables"); @@ -5396,10 +5395,9 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ for (i = 0; i < children; ++i) { zend_ast *prop_ast = list->child[i]; - zend_ast *type_ast = prop_ast->child[0]; - zend_ast *name_ast = prop_ast->child[1]; - zend_ast *value_ast = prop_ast->child[2]; - zend_ast *doc_comment_ast = prop_ast->child[3]; + zend_ast *name_ast = prop_ast->child[0]; + zend_ast *value_ast = prop_ast->child[1]; + zend_ast *doc_comment_ast = prop_ast->child[2]; zend_string *name = zend_ast_get_str(name_ast); zend_string *doc_comment = NULL; zval value_zv; @@ -5412,16 +5410,8 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ "Typed property %s::$%s must not be static", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - } - - if (!use_optional_types && i > 0) { - zend_error_noreturn(E_COMPILE_ERROR, - "Typed property %s::$%s must not be mixed with untyped properties", - ZSTR_VAL(ce->name), - ZSTR_VAL(name)); - } + } - use_optional_types = 1; if (type_ast->kind == ZEND_AST_TYPE) { optional_type = type_ast->attr; } else { @@ -5458,11 +5448,6 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ optional_type_name = class_name; } } - } else if (use_optional_types) { - zend_error_noreturn(E_COMPILE_ERROR, - "Untyped property %s::$%s must not be mixed with typed properties", - ZSTR_VAL(ce->name), - ZSTR_VAL(name)); } /* Doc comment has been appended as last element in ZEND_AST_PROP_ELEM ast */ @@ -5519,6 +5504,14 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */ } /* }}} */ +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); +} /* }}} */ + void zend_compile_class_const_decl(zend_ast *ast) /* {{{ */ { zend_ast_list *list = zend_ast_get_list(ast); @@ -7594,8 +7587,8 @@ void zend_compile_stmt(zend_ast *ast) /* {{{ */ case ZEND_AST_METHOD: zend_compile_func_decl(NULL, ast); 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); diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index efb0fffa5d39..ffa06b9d4d2b 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -701,8 +701,9 @@ class_statement_list: class_statement: - variable_modifiers property_list ';' - { $$ = $2; $$->attr = $1; } + variable_modifiers optional_type property_list ';' + { $3->attr = $1; + $$ = zend_ast_create(ZEND_AST_PROP_LIST, $2, $3); } | method_modifiers T_CONST class_const_list ';' { $$ = $3; $$->attr = $1; } | T_USE name_list trait_adaptations @@ -800,10 +801,10 @@ property_list: ; property: - optional_type T_VARIABLE backup_doc_comment - { $$ = zend_ast_create(ZEND_AST_PROP_ELEM, $1, $2, NULL, ($3 ? zend_ast_create_zval_from_str($3) : NULL)); } - | optional_type T_VARIABLE '=' expr backup_doc_comment - { $$ = zend_ast_create(ZEND_AST_PROP_ELEM, $1, $2, $4, ($5 ? zend_ast_create_zval_from_str($5) : NULL)); } + T_VARIABLE backup_doc_comment + { $$ = zend_ast_create(ZEND_AST_PROP_ELEM, $1, NULL, ($2 ? zend_ast_create_zval_from_str($2) : NULL)); } + | T_VARIABLE '=' expr backup_doc_comment + { $$ = zend_ast_create(ZEND_AST_PROP_ELEM, $1, $3, ($4 ? zend_ast_create_zval_from_str($4) : NULL)); } ; class_const_list: From 8f3ad60db3c50b0cb90ff7ab5e4156a7a82fba59 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 5 Apr 2016 01:40:58 +0100 Subject: [PATCH 109/369] overflow consistency --- Zend/zend_execute.c | 11 ++- Zend/zend_vm_def.h | 31 +++--- Zend/zend_vm_execute.h | 210 ++++++++++++++++++++++------------------- 3 files changed, 137 insertions(+), 115 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 70eca4941e48..66ff70751208 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1367,7 +1367,7 @@ static void zend_assign_to_string_offset(zval *str, zend_long offset, zval *valu } } -static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, zval *property, void **cache_slot, int inc, zval *result) +static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, zval *property, void **cache_slot, int inc, zval *result, zend_bool strict) { if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) { zval rv, obj; @@ -1403,6 +1403,15 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, decrement_function(&z_copy); } Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, cache_slot); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, &z_copy, strict)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + } + } OBJ_RELEASE(Z_OBJ(obj)); zval_ptr_dtor(&z_copy); zval_ptr_dtor(z); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index e03afc10e1e7..c6d9e90d6c74 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -749,6 +749,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, SEPARATE_ZVAL_NOREF(zptr); binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -1180,6 +1181,10 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); @@ -1190,10 +1195,6 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } } } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } } } else { zval _rv; @@ -1241,7 +1242,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_free_op free_op1, free_op2; zval *object; zval *property; - zval *zptr; + zval *zptr = NULL; SAVE_OPLINE(); object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW); @@ -1288,20 +1289,20 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, decrement_function(zptr); } } - } - } else { - zend_post_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); - } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + HANDLE_EXCEPTION(); + } + } } } + } else { + zend_post_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); } } while (0); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index c4270b0bde01..ed9f52701ce8 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17265,6 +17265,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE ZSTR_VAL(prop_info->ce->name), ZSTR_VAL(p->key)); HANDLE_EXCEPTION(); + } else if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, p->key, value); + HANDLE_EXCEPTION(); } } } @@ -17884,6 +17887,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SEPARATE_ZVAL_NOREF(zptr); binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -18373,7 +18377,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_free_op free_op1; zval *object; zval *property; - zval *zptr; + zval *zptr = NULL; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -18420,20 +18424,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP decrement_function(zptr); } } - } - } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); - } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + HANDLE_EXCEPTION(); + } + } } } + } else { + zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); } } while (0); @@ -22429,6 +22433,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SEPARATE_ZVAL_NOREF(zptr); binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -22918,7 +22923,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_free_op free_op1; zval *object; zval *property; - zval *zptr; + zval *zptr = NULL; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -22965,20 +22970,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP decrement_function(zptr); } } - } - } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); - } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + HANDLE_EXCEPTION(); + } + } } } + } else { + zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); } } while (0); @@ -25165,6 +25170,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SEPARATE_ZVAL_NOREF(zptr); binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -25657,7 +25663,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_free_op free_op1, free_op2; zval *object; zval *property; - zval *zptr; + zval *zptr = NULL; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -25704,20 +25710,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP decrement_function(zptr); } } - } - } else { - zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); - } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + HANDLE_EXCEPTION(); + } + } } } + } else { + zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); } } while (0); @@ -27825,6 +27831,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SEPARATE_ZVAL_NOREF(zptr); binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -28284,7 +28291,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; - zval *zptr; + zval *zptr = NULL; SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); @@ -28331,20 +28338,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP decrement_function(zptr); } } - } - } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); - } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + HANDLE_EXCEPTION(); + } + } } } + } else { + zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); } } while (0); @@ -31321,6 +31328,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SEPARATE_ZVAL_NOREF(zptr); binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -31780,7 +31788,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; - zval *zptr; + zval *zptr = NULL; SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); @@ -31827,20 +31835,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP decrement_function(zptr); } } - } - } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); - } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + HANDLE_EXCEPTION(); + } + } } } + } else { + zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); } } while (0); @@ -33756,6 +33764,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SEPARATE_ZVAL_NOREF(zptr); binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -34217,7 +34226,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_free_op free_op2; zval *object; zval *property; - zval *zptr; + zval *zptr = NULL; SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); @@ -34264,20 +34273,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP decrement_function(zptr); } } - } - } else { - zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); - } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + HANDLE_EXCEPTION(); + } + } } } + } else { + zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); } } while (0); @@ -38505,6 +38514,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SEPARATE_ZVAL_NOREF(zptr); binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -38994,7 +39004,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; - zval *zptr; + zval *zptr = NULL; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); @@ -39041,20 +39051,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP decrement_function(zptr); } } - } - } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); - } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + HANDLE_EXCEPTION(); + } + } } } + } else { + zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); } } while (0); @@ -45262,6 +45272,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SEPARATE_ZVAL_NOREF(zptr); binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -45751,7 +45762,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; - zval *zptr; + zval *zptr = NULL; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); @@ -45798,20 +45809,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP decrement_function(zptr); } } - } - } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); - } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + HANDLE_EXCEPTION(); + } + } } } + } else { + zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); } } while (0); @@ -49090,6 +49101,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SEPARATE_ZVAL_NOREF(zptr); binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -49582,7 +49594,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_free_op free_op2; zval *object; zval *property; - zval *zptr; + zval *zptr = NULL; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); @@ -49629,20 +49641,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP decrement_function(zptr); } } - } - } else { - zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); - } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); + if (prop_info) { + if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + HANDLE_EXCEPTION(); + } + } } } + } else { + zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); } } while (0); From f13b0a3039d7eebde9dd797a4e185bc9b2762bc5 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 5 Apr 2016 01:45:34 +0100 Subject: [PATCH 110/369] moar consistent ... even if strange --- Zend/zend_vm_def.h | 11 +- Zend/zend_vm_execute.h | 468 ++++++++++++++++++++++------------------- 2 files changed, 258 insertions(+), 221 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index c6d9e90d6c74..ed58d6a23b1b 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2454,6 +2454,12 @@ ZEND_VM_C_LABEL(fast_assign_obj): ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -2465,11 +2471,6 @@ ZEND_VM_C_LABEL(fast_assign_obj): } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (OP_DATA_TYPE == IS_CONST) { zval_ptr_dtor_nogc(value); } else { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index ed9f52701ce8..346f368c48f4 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18317,6 +18317,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); @@ -18327,10 +18331,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } } } else { zval _rv; @@ -18952,6 +18952,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -18963,11 +18969,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -19138,6 +19139,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -19149,11 +19156,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -19324,6 +19326,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -19335,11 +19343,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -19510,6 +19513,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -19521,11 +19530,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -22863,6 +22867,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); @@ -22873,10 +22881,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } } } else { zval _rv; @@ -23498,6 +23502,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -23509,11 +23519,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -23684,6 +23689,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -23695,11 +23706,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -23870,6 +23876,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -23881,11 +23893,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -24056,6 +24063,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -24067,11 +24080,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -25602,6 +25610,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); @@ -25612,10 +25624,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } } } else { zval _rv; @@ -26239,6 +26247,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -26250,11 +26264,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -26425,6 +26434,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -26436,11 +26451,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -26611,6 +26621,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -26622,11 +26638,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -26797,6 +26808,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -26808,11 +26825,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -28231,6 +28243,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); @@ -28241,10 +28257,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } } } else { zval _rv; @@ -28847,6 +28859,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -28858,11 +28876,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -29033,6 +29046,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -29044,11 +29063,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -29219,6 +29233,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -29230,11 +29250,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -29405,6 +29420,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -29416,11 +29437,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -31728,6 +31744,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); @@ -31738,10 +31758,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } } } else { zval _rv; @@ -32344,6 +32360,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -32355,11 +32377,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -32530,6 +32547,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -32541,11 +32564,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -32716,6 +32734,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -32727,11 +32751,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -32902,6 +32921,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -32913,11 +32938,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -34165,6 +34185,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); @@ -34175,10 +34199,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } } } else { zval _rv; @@ -34784,6 +34804,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -34795,11 +34821,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -34970,6 +34991,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -34981,11 +35008,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -35156,6 +35178,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -35167,11 +35195,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -35342,6 +35365,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -35353,11 +35382,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -38944,6 +38968,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); @@ -38954,10 +38982,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } } } else { zval _rv; @@ -39913,6 +39937,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -39924,11 +39954,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -40099,6 +40124,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -40110,11 +40141,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -40285,6 +40311,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -40296,11 +40328,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -40471,6 +40498,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -40482,11 +40515,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -45702,6 +45730,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); @@ -45712,10 +45744,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } } } else { zval _rv; @@ -46532,6 +46560,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -46543,11 +46577,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -46718,6 +46747,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -46729,11 +46764,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -46904,6 +46934,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -46915,11 +46951,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -47090,6 +47121,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -47101,11 +47138,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -49533,6 +49565,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); @@ -49543,10 +49579,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); - } } } else { zval _rv; @@ -50366,6 +50398,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -50377,11 +50415,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -50552,6 +50585,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -50563,11 +50602,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -50738,6 +50772,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -50749,11 +50789,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -50924,6 +50959,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -50935,11 +50976,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); - - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { From dd6d5ad051b70c21e7b6e57c3d7dc3b5079883a4 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 5 Apr 2016 02:10:20 +0100 Subject: [PATCH 111/369] make var_dump more acceptable --- .../type_declarations/typed_properties_037.phpt | 17 +++++++++++++++++ ext/standard/var.c | 17 ++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_037.phpt 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 000000000000..8bdd6748b2e9 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_037.phpt @@ -0,0 +1,17 @@ +--TEST-- +Test typed properties var_dump uninitialized +--FILE-- + + int(10) + ["qux"]=> + uninitialized(integer) +} + diff --git a/ext/standard/var.c b/ext/standard/var.c index bc766990703e..a7a70637f766 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -48,7 +48,7 @@ static void php_array_element_dump(zval *zv, zend_ulong index, zend_string *key, } /* }}} */ -static void php_object_property_dump(zval *zv, zend_ulong index, zend_string *key, int level) /* {{{ */ +static void php_object_property_dump(zend_property_info *prop_info, zval *zv, zend_ulong index, zend_string *key, int level) /* {{{ */ { const char *prop_name, *class_name; @@ -71,7 +71,16 @@ static void php_object_property_dump(zval *zv, zend_ulong index, zend_string *ke } ZEND_PUTS("]=>\n"); } - php_var_dump(zv, level + 2); + + if (prop_info && Z_TYPE_P(zv) == IS_NULL) { + php_printf("%*cuninitialized(%s)\n", + level + 1, ' ', + (prop_info->type == IS_OBJECT) ? + ZSTR_VAL(prop_info->type_name) : + zend_get_type_by_const(prop_info->type)); + } else { + php_var_dump(zv, level + 2); + } } /* }}} */ @@ -156,7 +165,9 @@ PHPAPI void php_var_dump(zval *struc, int level) /* {{{ */ zval *val; ZEND_HASH_FOREACH_KEY_VAL_IND(myht, num, key, val) { - php_object_property_dump(val, num, key, level); + zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(struc, key, NULL); + + php_object_property_dump(prop_info, val, num, key, level); } ZEND_HASH_FOREACH_END(); if (is_temp) { zend_hash_destroy(myht); From a99e7d11949c385bc0923ad911421639de354219 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 5 Apr 2016 02:15:07 +0100 Subject: [PATCH 112/369] better --- ext/standard/var.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ext/standard/var.c b/ext/standard/var.c index a7a70637f766..dc0f2edb8108 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -165,7 +165,11 @@ PHPAPI void php_var_dump(zval *struc, int level) /* {{{ */ zval *val; ZEND_HASH_FOREACH_KEY_VAL_IND(myht, num, key, val) { - zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(struc, key, NULL); + zend_property_info *prop_info = NULL; + + if (ZEND_OBJECT_HAS_TYPE_HINTS(struc)) { + prop_info = zend_object_fetch_property_type_info_ex(struc, key, NULL); + } php_object_property_dump(prop_info, val, num, key, level); } ZEND_HASH_FOREACH_END(); From e7d8aa77b5833fe250192ebc44f378ac418dc037 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 5 Apr 2016 09:25:07 +0100 Subject: [PATCH 113/369] haaaaaands --- Zend/zend_execute.c | 80 +- Zend/zend_object_handlers.c | 22 + Zend/zend_vm_def.h | 107 +-- Zend/zend_vm_execute.h | 1544 ++++++++++------------------------- 4 files changed, 521 insertions(+), 1232 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index be4a82c3a725..f3d7316e19cf 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1367,7 +1367,7 @@ static void zend_assign_to_string_offset(zval *str, zend_long offset, zval *valu } } -static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, zval *property, void **cache_slot, int inc, zval *result, zend_bool strict) +static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, zval *property, void **cache_slot, int inc, zval *result) { if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) { zval rv, obj; @@ -1403,15 +1403,7 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, decrement_function(&z_copy); } Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, cache_slot); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, &z_copy, strict)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - } - } + OBJ_RELEASE(Z_OBJ(obj)); zval_ptr_dtor(&z_copy); zval_ptr_dtor(z); @@ -1424,6 +1416,7 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, zval *property, void **cache_slot, int inc, zval *result) { zval rv; + zend_property_info *prop_info = NULL; if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) { zval *z, obj; @@ -1447,15 +1440,44 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, } ZVAL_DEREF(z); SEPARATE_ZVAL_NOREF(z); - if (inc) { - increment_function(z); + if (ZEND_OBJECT_HAS_TYPE_HINTS(object) && (prop_info = zend_object_fetch_property_type_info(object, property, cache_slot))) { + zval tmp; + + ZVAL_DUP(&tmp, z); + + if (inc) { + increment_function(&tmp); + } else { + decrement_function(&tmp); + } + + if (!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &tmp); + OBJ_RELEASE(Z_OBJ(obj)); + zval_ptr_dtor(z); + return; + } + + zval_ptr_dtor(z); + ZVAL_COPY_VALUE(z, &tmp); + + if (UNEXPECTED(result)) { + ZVAL_COPY(result, z); + } + + Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); } else { - decrement_function(z); - } - if (UNEXPECTED(result)) { - ZVAL_COPY(result, z); + if (inc) { + increment_function(z); + } else { + decrement_function(z); + } + if (UNEXPECTED(result)) { + ZVAL_COPY(result, z); + } + Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); } - Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); + OBJ_RELEASE(Z_OBJ(obj)); zval_ptr_dtor(z); } else { @@ -1492,7 +1514,29 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z zptr = z; ZVAL_DEREF(z); SEPARATE_ZVAL_NOREF(z); - binary_op(z, z, value); + + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, cache_slot); + + if (prop_info) { + zval tmp; + + ZVAL_UNDEF(&tmp); + binary_op(&tmp, z, value); + if (!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &tmp); + OBJ_RELEASE(Z_OBJ(obj)); + return; + } + + ZVAL_COPY_VALUE(z, &tmp); + } else { + binary_op(z, z, value); + } + } else { + binary_op(z, z, value); + } + Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); if (UNEXPECTED(result)) { ZVAL_COPY(result, z); diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index a17e911e5e20..d73f67643fdf 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -671,6 +671,16 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v } if ((variable_ptr = zend_hash_find(zobj->properties, Z_STR_P(member))) != NULL) { found: + if (ZEND_OBJECT_HAS_TYPE_HINTS(object)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, member, cache_slot); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { + zend_verify_property_type_error(prop_info, Z_STR_P(member), value); + goto exit; + } + } + } zend_assign_to_variable(variable_ptr, value, IS_CV); goto exit; } @@ -719,6 +729,18 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v Z_ADDREF_P(value); } } + + if (ZEND_OBJECT_HAS_TYPE_HINTS(object)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, member, cache_slot); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { + zend_verify_property_type_error(prop_info, Z_STR_P(member), value); + goto exit; + } + } + } + if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) { ZVAL_COPY_VALUE(OBJ_PROP(zobj, property_offset), value); } else { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 3adde1641205..e104ec6e2942 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -735,7 +735,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -753,40 +753,8 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } else { - zval _result, - *rp = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_result; - - ZVAL_UNDEF(&_result); - - zend_assign_op_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_result); - } + zend_assign_op_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while(0); @@ -1157,7 +1125,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -1184,40 +1152,9 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zval _rv; - zval *rv = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_rv; - ZVAL_UNDEF(&_rv); - - zend_pre_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_rv); - } + zend_pre_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -1267,7 +1204,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -1289,20 +1226,9 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, decrement_function(zptr); } } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zend_post_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); + zend_post_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } } while (0); @@ -2369,6 +2295,16 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { ZEND_VM_C_LABEL(fast_assign_obj): + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, OP_DATA_TYPE); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -2460,17 +2396,6 @@ ZEND_VM_C_LABEL(fast_assign_obj): ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (OP_DATA_TYPE == IS_CONST) { zval_ptr_dtor_nogc(value); } else { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 195679e34679..c4a5b40c2d9d 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17969,7 +17969,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -17987,40 +17987,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } else { - zval _result, - *rp = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_result; - - ZVAL_UNDEF(&_result); - - zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_result); - } + zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while(0); @@ -18389,7 +18357,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -18416,40 +18384,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zval _rv; - zval *rv = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_rv; - ZVAL_UNDEF(&_rv); - - zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_rv); - } + zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -18498,7 +18435,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -18520,20 +18457,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP decrement_function(zptr); } } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); + zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } } while (0); @@ -18963,6 +18889,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -19054,17 +18990,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -19150,6 +19075,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -19241,17 +19176,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -19337,6 +19261,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -19428,17 +19362,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -19524,6 +19447,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -19615,17 +19548,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -22539,7 +22461,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -22557,40 +22479,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } else { - zval _result, - *rp = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_result; - - ZVAL_UNDEF(&_result); - - zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_result); - } + zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while(0); @@ -22959,7 +22849,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -22986,40 +22876,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zval _rv; - zval *rv = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_rv; - ZVAL_UNDEF(&_rv); - - zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_rv); - } + zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -23068,7 +22927,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -23090,20 +22949,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP decrement_function(zptr); } } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); + zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } } while (0); @@ -23533,6 +23381,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -23624,17 +23482,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -23720,6 +23567,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -23811,17 +23668,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -23907,6 +23753,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -23998,17 +23854,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -24094,6 +23939,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -24185,17 +24040,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -25290,7 +25134,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -25308,40 +25152,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } else { - zval _result, - *rp = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_result; - - ZVAL_UNDEF(&_result); - - zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_result); - } + zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while(0); @@ -25712,7 +25524,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -25739,40 +25551,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zval _rv; - zval *rv = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_rv; - ZVAL_UNDEF(&_rv); - - zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_rv); - } + zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -25822,7 +25603,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -25844,20 +25625,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP decrement_function(zptr); } } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); + zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } } while (0); @@ -26288,6 +26058,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -26379,17 +26159,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -26475,6 +26244,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -26566,17 +26345,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -26662,6 +26430,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -26753,17 +26531,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -26849,6 +26616,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -26940,17 +26717,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -27968,7 +27734,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -27986,40 +27752,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } else { - zval _result, - *rp = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_result; - - ZVAL_UNDEF(&_result); - - zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_result); - } + zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while(0); @@ -28358,7 +28092,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -28385,40 +28119,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zval _rv; - zval *rv = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_rv; - ZVAL_UNDEF(&_rv); - - zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_rv); - } + zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -28467,7 +28170,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -28489,20 +28192,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP decrement_function(zptr); } } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); + zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } } while (0); @@ -28913,6 +28605,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -29004,17 +28706,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -29100,6 +28791,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -29191,17 +28892,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -29287,6 +28977,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -29375,18 +29075,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } + ZVAL_COPY(EX_VAR(opline->result.var), value); } if (IS_VAR == IS_CONST) { @@ -29474,6 +29163,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -29565,17 +29264,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -31492,7 +31180,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -31510,40 +31198,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } else { - zval _result, - *rp = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_result; - - ZVAL_UNDEF(&_result); - - zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_result); - } + zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while(0); @@ -31882,7 +31538,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -31909,40 +31565,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zval _rv; - zval *rv = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_rv; - ZVAL_UNDEF(&_rv); - - zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_rv); - } + zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -31991,7 +31616,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -32013,20 +31638,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP decrement_function(zptr); } } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); + zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } } while (0); @@ -32437,6 +32051,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -32528,17 +32152,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -32624,6 +32237,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -32715,17 +32338,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -32811,6 +32423,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -32902,17 +32524,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -32998,6 +32609,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -33089,17 +32710,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -33945,7 +33555,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -33963,40 +33573,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } else { - zval _result, - *rp = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_result; - - ZVAL_UNDEF(&_result); - - zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_result); - } + zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while(0); @@ -34336,7 +33914,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -34363,40 +33941,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zval _rv; - zval *rv = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_rv; - ZVAL_UNDEF(&_rv); - - zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_rv); - } + zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -34446,7 +33993,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -34468,20 +34015,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP decrement_function(zptr); } } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); + zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } } while (0); @@ -34894,6 +34430,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -34985,17 +34531,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -35081,6 +34616,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -35172,17 +34717,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -35268,6 +34802,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -35359,17 +34903,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -35455,6 +34988,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -35546,17 +35089,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -38714,7 +38246,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -38732,40 +38264,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } else { - zval _result, - *rp = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_result; - - ZVAL_UNDEF(&_result); - - zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_result); - } + zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while(0); @@ -39134,7 +38634,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -39161,40 +38661,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zval _rv; - zval *rv = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_rv; - ZVAL_UNDEF(&_rv); - - zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_rv); - } + zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -39243,7 +38712,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -39257,28 +38726,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } else { ZVAL_DEREF(zptr); - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); + zval_opt_copy_ctor(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); } } } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); + zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } } while (0); @@ -40042,6 +39500,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -40133,17 +39601,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -40229,6 +39686,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -40320,17 +39787,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -40416,6 +39872,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -40507,17 +39973,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -40603,6 +40058,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -40694,17 +40159,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -45479,7 +44933,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -45497,40 +44951,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } else { - zval _result, - *rp = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_result; - - ZVAL_UNDEF(&_result); - - zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_result); - } + zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while(0); @@ -45899,7 +45321,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -45926,40 +45348,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zval _rv; - zval *rv = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_rv; - ZVAL_UNDEF(&_rv); - - zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_rv); - } + zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -46008,7 +45399,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -46030,20 +45421,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP decrement_function(zptr); } } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); + zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } } while (0); @@ -46668,6 +46048,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -46759,17 +46149,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -46855,6 +46234,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -46946,17 +46335,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -47042,6 +46420,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -47133,17 +46521,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -47229,6 +46606,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -47320,17 +46707,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -49315,7 +48691,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -49333,40 +48709,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } else { - zval _result, - *rp = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_result; - - ZVAL_UNDEF(&_result); - - zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, rp); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, rp, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), rp); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_result); - } + zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while(0); @@ -49737,7 +49081,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -49764,40 +49108,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zval _rv; - zval *rv = RETURN_VALUE_USED(opline) ? - EX_VAR(opline->result.var) : &_rv; - ZVAL_UNDEF(&_rv); - - zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, rv); - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&_rv); - } + zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -49847,7 +49160,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -49869,20 +49182,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP decrement_function(zptr); } } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, zptr, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - HANDLE_EXCEPTION(); - } - } - } } } else { - zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES()); + zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); } } while (0); @@ -50509,6 +49811,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -50600,17 +49912,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -50696,6 +49997,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -50787,17 +50098,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -50883,6 +50183,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -50974,17 +50284,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -51070,6 +50369,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: + if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -51161,17 +50470,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { From 88ff051ed4429cca891cc2f534e996ff95e11fc5 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 5 Apr 2016 09:28:38 +0100 Subject: [PATCH 114/369] add overflowingness test --- .../typed_properties_038.phpt | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_038.phpt 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 000000000000..9673d411d1b7 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_038.phpt @@ -0,0 +1,60 @@ +--TEST-- +Test typed properties overflowing +--FILE-- +bar++; +} catch(TypeError $t) { + var_dump($t->getMessage()); +} + +var_dump($foo); + +try { + $foo->bar += 1; +} catch(TypeError $t) { + var_dump($t->getMessage()); +} + +var_dump($foo); + +try { + ++$foo->bar; +} catch(TypeError $t) { + var_dump($t->getMessage()); +} + +var_dump($foo); + +try { + $foo->bar = $foo->bar + 1; +} catch(TypeError $t) { + var_dump($t->getMessage()); +} + +var_dump($foo); +--EXPECTF-- +string(64) "Typed property class@anonymous::$bar must be integer, float used" +object(class@anonymous)#%d (%d) { + ["bar"]=> + int(%d) +} +string(64) "Typed property class@anonymous::$bar must be integer, float used" +object(class@anonymous)#%d (%d) { + ["bar"]=> + int(%d) +} +string(64) "Typed property class@anonymous::$bar must be integer, float used" +object(class@anonymous)#%d (%d) { + ["bar"]=> + int(%d) +} +string(64) "Typed property class@anonymous::$bar must be integer, float used" +object(class@anonymous)#%d (%d) { + ["bar"]=> + int(%d) +} From 7e02f5059b091cf2946b58c8a7dc9c47c63c7940 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 5 Apr 2016 10:21:48 +0100 Subject: [PATCH 115/369] make travis run --- Zend/tests/type_declarations/typed_properties_038.phpt | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/tests/type_declarations/typed_properties_038.phpt b/Zend/tests/type_declarations/typed_properties_038.phpt index 9673d411d1b7..d25d2fc1a906 100644 --- a/Zend/tests/type_declarations/typed_properties_038.phpt +++ b/Zend/tests/type_declarations/typed_properties_038.phpt @@ -2,6 +2,7 @@ Test typed properties overflowing --FILE-- Date: Tue, 5 Apr 2016 10:31:00 +0100 Subject: [PATCH 116/369] fix test [ci skip] --- .../tests/type_declarations/typed_properties_027.phpt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_027.phpt b/Zend/tests/type_declarations/typed_properties_027.phpt index 7509f89b1b80..f8cea4c764c5 100644 --- a/Zend/tests/type_declarations/typed_properties_027.phpt +++ b/Zend/tests/type_declarations/typed_properties_027.phpt @@ -1,14 +1,19 @@ --TEST-- -Test typed properties int must be allowed to widen to float only at runtime +Test typed properties float widen at runtime --FILE-- bar = 10; + +var_dump($foo->bar); ?> --EXPECTF-- -Fatal error: Default value for properties with integer type can only be integer in %s on line 4 +float(10) From 26e1afbcddbc2a6fa6c68db7581799e96e9fc705 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 6 Apr 2016 08:48:16 +0100 Subject: [PATCH 117/369] fix memory error in std_write_property --- Zend/zend_object_handlers.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index d73f67643fdf..bb4ee986b32a 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -671,7 +671,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v } if ((variable_ptr = zend_hash_find(zobj->properties, Z_STR_P(member))) != NULL) { found: - if (ZEND_OBJECT_HAS_TYPE_HINTS(object)) { + if (ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, member, cache_slot); if (prop_info) { From a2d6d5b6f0a4e05866d3777af5668ad386413b68 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 6 Apr 2016 08:50:01 +0100 Subject: [PATCH 118/369] fix another possible memory error --- Zend/zend_object_handlers.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index bb4ee986b32a..1cb6ffc92302 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -730,7 +730,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v } } - if (ZEND_OBJECT_HAS_TYPE_HINTS(object)) { + if (ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, member, cache_slot); if (prop_info) { From 46742861d254a5fe74b6d88dde4232e4bae4bb5c Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 6 Apr 2016 08:58:51 +0100 Subject: [PATCH 119/369] better guard here and use _ex to avoid ever reading type info, we know its an object --- Zend/zend_object_handlers.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 1cb6ffc92302..c101b4e7fcee 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -671,8 +671,8 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v } if ((variable_ptr = zend_hash_find(zobj->properties, Z_STR_P(member))) != NULL) { found: - if (ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, member, cache_slot); + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) && Z_TYPE_P(member) == IS_STRING)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot); if (prop_info) { if (!zend_verify_property_type(prop_info, value, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { @@ -730,8 +730,8 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v } } - if (ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, member, cache_slot); + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) && Z_TYPE_P(member) == IS_STRING)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot); if (prop_info) { if (!zend_verify_property_type(prop_info, value, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { From ff56cd6ba04e33a1580f88935678ba6f644d4290 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 6 Apr 2016 20:02:35 +0100 Subject: [PATCH 120/369] don't perform check on inline properties on read, only for magic fix binary op handler add case to zend_vm_is_fetching_reference optimize zend_verify_property_type for most common case in first branch remove useless undef --- Zend/zend_execute.c | 22 ++++++++++++++-------- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 30 +++++++++++++++--------------- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index f3d7316e19cf..e1f987ecf344 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -180,11 +180,14 @@ ZEND_API void* zend_vm_stack_extend(size_t size) zend_bool zend_vm_is_fetching_reference(const zend_op * opline) { zend_op const *next = opline + 1; - while (next->opcode == ZEND_NOP || - next->opcode == ZEND_TICKS || - next->opcode == ZEND_EXT_NOP || - next->opcode == ZEND_EXT_STMT) - next++; + switch (next->opcode) { + case ZEND_NOP: + case ZEND_TICKS: + case ZEND_EXT_STMT: + case ZEND_FETCH_DIM_W: { + next++; + } break; + } switch (next->opcode) { case ZEND_SEND_REF: @@ -877,6 +880,10 @@ void zend_verify_property_type_error(zend_property_info *info, zend_string *name } zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) { + if (EXPECTED(ZEND_SAME_FAKE_TYPE(info->type, Z_TYPE_P(property)) && Z_TYPE_P(property) != IS_OBJECT)) { + return 1; + } + switch (info->type) { case IS_OBJECT: { zend_string *resolved = zend_resolve_property_type(info->type_name, info->ce); @@ -1521,15 +1528,14 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z if (prop_info) { zval tmp; - ZVAL_UNDEF(&tmp); binary_op(&tmp, z, value); if (!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { zend_verify_property_type_error(prop_info, Z_STR_P(property), &tmp); OBJ_RELEASE(Z_OBJ(obj)); return; } - - ZVAL_COPY_VALUE(z, &tmp); + zval_ptr_dtor(z); + ZVAL_COPY(z, &tmp); } else { binary_op(z, z, value); } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index e104ec6e2942..6007619ca3ef 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1850,7 +1850,7 @@ ZEND_VM_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + ZEND_VM_C_GOTO(fetch_obj_r_exit); } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index c4a5b40c2d9d..e8d934760a2e 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5663,7 +5663,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); @@ -9537,7 +9537,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); @@ -11489,7 +11489,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); @@ -14018,7 +14018,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); @@ -15273,7 +15273,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); @@ -15829,7 +15829,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); @@ -18612,7 +18612,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); @@ -23104,7 +23104,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); @@ -25781,7 +25781,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); @@ -28256,7 +28256,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); @@ -31702,7 +31702,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); @@ -34080,7 +34080,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); @@ -39056,7 +39056,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); @@ -45604,7 +45604,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); @@ -49366,7 +49366,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); From 2181b0ef5f83ee07d52762e5c0ff7ebd400c58a5 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 6 Apr 2016 20:08:10 +0100 Subject: [PATCH 121/369] use more efficient macro when possible --- Zend/zend_vm_def.h | 16 ++-- Zend/zend_vm_execute.h | 174 ++++++++++++++++++++--------------------- 2 files changed, 95 insertions(+), 95 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 6007619ca3ef..7e3437c084b3 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -735,7 +735,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -1125,7 +1125,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -1204,7 +1204,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -1875,7 +1875,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): } } while (0); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -2295,7 +2295,7 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { ZEND_VM_C_LABEL(fast_assign_obj): - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -6210,7 +6210,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) FREE_OP1_VAR_PTR(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -6257,7 +6257,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) zend_object_iterator *iter; zend_bool is_empty; - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -6418,7 +6418,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR) p++; } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array) && p->key)) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array)) && p->key)) { zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(array, p->key, NULL); if (UNEXPECTED(prop_info)) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index e8d934760a2e..0308a60586cf 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4305,7 +4305,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -4351,7 +4351,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER zend_object_iterator *iter; zend_bool is_empty; - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -5688,7 +5688,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H } } while (0); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -9562,7 +9562,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND } } while (0); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -11514,7 +11514,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ } } while (0); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -13528,7 +13528,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_TMP_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -13574,7 +13574,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z zend_object_iterator *iter; zend_bool is_empty; - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -14043,7 +14043,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN } } while (0); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -15298,7 +15298,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE } } while (0); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -15854,7 +15854,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA } } while (0); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -17143,7 +17143,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -17190,7 +17190,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z zend_object_iterator *iter; zend_bool is_empty; - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -17351,7 +17351,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE p++; } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array) && p->key)) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array)) && p->key)) { zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(array, p->key, NULL); if (UNEXPECTED(prop_info)) { @@ -17969,7 +17969,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -18357,7 +18357,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -18435,7 +18435,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -18637,7 +18637,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN } } while (0); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -18889,7 +18889,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -19075,7 +19075,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -19261,7 +19261,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -19447,7 +19447,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -22461,7 +22461,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -22849,7 +22849,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -22927,7 +22927,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -23129,7 +23129,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE } } while (0); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -23381,7 +23381,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -23567,7 +23567,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -23753,7 +23753,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -23939,7 +23939,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -25134,7 +25134,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -25524,7 +25524,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -25603,7 +25603,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -25806,7 +25806,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA } } while (0); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -26058,7 +26058,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -26244,7 +26244,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -26430,7 +26430,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -26616,7 +26616,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -27734,7 +27734,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -28092,7 +28092,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -28170,7 +28170,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -28281,7 +28281,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ } } while (0); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -28605,7 +28605,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -28791,7 +28791,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -28977,7 +28977,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -29163,7 +29163,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -31180,7 +31180,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -31538,7 +31538,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -31616,7 +31616,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -31727,7 +31727,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN } } while (0); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -32051,7 +32051,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -32237,7 +32237,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -32423,7 +32423,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -32609,7 +32609,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -33555,7 +33555,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -33914,7 +33914,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -33993,7 +33993,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -34105,7 +34105,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR } } while (0); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -34430,7 +34430,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -34616,7 +34616,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -34802,7 +34802,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -34988,7 +34988,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -37141,7 +37141,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -37187,7 +37187,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE zend_object_iterator *iter; zend_bool is_empty; - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(array_ptr))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -38246,7 +38246,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -38634,7 +38634,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -38712,7 +38712,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -39081,7 +39081,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND } } while (0); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -39500,7 +39500,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -39686,7 +39686,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -39872,7 +39872,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -40058,7 +40058,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -44933,7 +44933,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -45321,7 +45321,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -45399,7 +45399,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -45629,7 +45629,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER } } while (0); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -46048,7 +46048,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -46234,7 +46234,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -46420,7 +46420,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -46606,7 +46606,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -48691,7 +48691,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { @@ -49081,7 +49081,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -49160,7 +49160,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_OBJECT_HAS_TYPE_HINTS(object)) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -49391,7 +49391,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN } } while (0); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -49811,7 +49811,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -49997,7 +49997,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -50183,7 +50183,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -50369,7 +50369,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { From e8bac369d2b8e65cc6b374a9dded6a5c41cb1798 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 6 Apr 2016 20:19:21 +0100 Subject: [PATCH 122/369] fix test case given by dmitry ... --- Zend/zend_execute.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index e1f987ecf344..8906b05aa00d 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1403,7 +1403,28 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, } else { ZVAL_COPY(result, z); } + + if (ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_TYPE_P(property) == IS_STRING) { + zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); + + if (prop_info) { + if (Z_TYPE_P(result) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property)); + OBJ_RELEASE(Z_OBJ(obj)); + zval_ptr_dtor(z); + return; + } else if (!zend_verify_property_type(prop_info, result, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), result); + return; + } + } + } + ZVAL_DUP(&z_copy, result); + if (inc) { increment_function(&z_copy); } else { From 335ca97434e2b25a0dbd04529d98152abd25c5dd Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 6 Apr 2016 22:10:24 +0100 Subject: [PATCH 123/369] only need null check here --- Zend/zend_execute.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 8906b05aa00d..30fde391cbeb 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1406,7 +1406,7 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, if (ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_TYPE_P(property) == IS_STRING) { zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); - + if (prop_info) { if (Z_TYPE_P(result) == IS_NULL) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, @@ -1416,22 +1416,18 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, OBJ_RELEASE(Z_OBJ(obj)); zval_ptr_dtor(z); return; - } else if (!zend_verify_property_type(prop_info, result, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), result); - return; } } } ZVAL_DUP(&z_copy, result); - 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); From 239216a3dd6861c27c2f50100c8fded4640aaf8f Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 6 Apr 2016 22:21:54 +0100 Subject: [PATCH 124/369] use more efficient stuff here --- Zend/zend_execute.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 30fde391cbeb..f0685c044967 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1464,7 +1464,9 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, } ZVAL_DEREF(z); SEPARATE_ZVAL_NOREF(z); - if (ZEND_OBJECT_HAS_TYPE_HINTS(object) && (prop_info = zend_object_fetch_property_type_info(object, property, cache_slot))) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && + (Z_TYPE_P(property) == IS_STRING) && + (prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot)))) { zval tmp; ZVAL_DUP(&tmp, z); @@ -1475,7 +1477,7 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, decrement_function(&tmp); } - if (!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { zend_verify_property_type_error(prop_info, Z_STR_P(property), &tmp); OBJ_RELEASE(Z_OBJ(obj)); zval_ptr_dtor(z); @@ -1539,8 +1541,8 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z ZVAL_DEREF(z); SEPARATE_ZVAL_NOREF(z); - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property, cache_slot); + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE(obj)) && Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); if (prop_info) { zval tmp; From 6f57c44d2c61ed553d572eb5c5dc88b4e149b27b Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 6 Apr 2016 22:27:30 +0100 Subject: [PATCH 125/369] this was checked on write too --- Zend/zend_vm_def.h | 4 ++-- Zend/zend_vm_execute.h | 30 +++++++++++++++--------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7e3437c084b3..69db9511abb7 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1856,7 +1856,7 @@ ZEND_VM_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + ZEND_VM_C_GOTO(fetch_obj_r_exit); } } } @@ -1888,7 +1888,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); - } + } } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 0308a60586cf..3fdec9511170 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5669,7 +5669,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } } @@ -9543,7 +9543,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } } @@ -11495,7 +11495,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } } @@ -14024,7 +14024,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } } @@ -15279,7 +15279,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } } @@ -15835,7 +15835,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } } @@ -18618,7 +18618,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } } @@ -23110,7 +23110,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } } @@ -25787,7 +25787,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } } @@ -28262,7 +28262,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } } @@ -31708,7 +31708,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } } @@ -34086,7 +34086,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } } @@ -39062,7 +39062,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } } @@ -45610,7 +45610,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } } @@ -49372,7 +49372,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; + goto fetch_obj_r_exit; } } } From e62942a2881402a846bd54f7f527b41a36fad154 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 6 Apr 2016 22:50:22 +0100 Subject: [PATCH 126/369] safety for non standard objects, remove pointless check --- Zend/zend_object_handlers.c | 11 - Zend/zend_vm_def.h | 12 + Zend/zend_vm_execute.h | 432 ++++++++++++++++++++++++++++++++++++ 3 files changed, 444 insertions(+), 11 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index c101b4e7fcee..cc423e74d69e 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -730,17 +730,6 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v } } - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) && Z_TYPE_P(member) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { - zend_verify_property_type_error(prop_info, Z_STR_P(member), value); - goto exit; - } - } - } - if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) { ZVAL_COPY_VALUE(OBJ_PROP(zobj, property_offset), value); } else { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 69db9511abb7..fe5fa525c320 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2390,6 +2390,18 @@ ZEND_VM_C_LABEL(fast_assign_obj): ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 3fdec9511170..c15b9f06683f 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18984,6 +18984,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -19170,6 +19182,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -19356,6 +19380,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -19542,6 +19578,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -23476,6 +23524,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -23662,6 +23722,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -23848,6 +23920,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -24034,6 +24118,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -26153,6 +26249,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -26339,6 +26447,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -26525,6 +26645,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -26711,6 +26843,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -28700,6 +28844,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -28886,6 +29042,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -29072,6 +29240,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -29258,6 +29438,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -32146,6 +32338,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -32332,6 +32536,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -32518,6 +32734,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -32704,6 +32932,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -34525,6 +34765,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -34711,6 +34963,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -34897,6 +35161,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -35083,6 +35359,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -39595,6 +39883,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -39781,6 +40081,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -39967,6 +40279,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -40153,6 +40477,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -46143,6 +46479,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -46329,6 +46677,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -46515,6 +46875,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -46701,6 +47073,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -49906,6 +50290,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -50092,6 +50488,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -50278,6 +50686,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -50464,6 +50884,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } + /* safety for non standard zend objects */ + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); + + if (prop_info) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); + } + } + } + Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { From 48d5aec17993e92163fce239c7a210fb0f5c6623 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 6 Apr 2016 23:02:21 +0100 Subject: [PATCH 127/369] some more improvements ... haaaands --- .../typed_properties_020.phpt | 16 +++++--------- Zend/zend_execute.c | 22 +++++++++++++++++-- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt index 95d4d5b60884..03fdd714b536 100644 --- a/Zend/tests/type_declarations/typed_properties_020.phpt +++ b/Zend/tests/type_declarations/typed_properties_020.phpt @@ -2,24 +2,20 @@ Test typed properties binary assign op helper test --FILE-- bar += 1; + $this->bar += 2; } } $foo = new Foo(); + +var_dump($foo->bar); ?> ---EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Foo::$bar must be string, integer used in %s:8 -Stack trace: -#0 %s(12): Foo->__construct() -#1 {main} - thrown in %s on line 8 +--EXPECT-- +int(2) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index f0685c044967..b648ea311d60 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1469,6 +1469,15 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, (prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot)))) { zval tmp; + if (Z_TYPE_P(z) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property)); + OBJ_RELEASE(Z_OBJ(obj)); + return; + } + ZVAL_DUP(&tmp, z); if (inc) { @@ -1541,12 +1550,21 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z ZVAL_DEREF(z); SEPARATE_ZVAL_NOREF(z); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE(obj)) && Z_TYPE_P(property) == IS_STRING)) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE(obj)) && Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); if (prop_info) { zval tmp; - + + if (Z_TYPE_P(z) == IS_NULL) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(property)); + OBJ_RELEASE(Z_OBJ(obj)); + return; + } + binary_op(&tmp, z, value); if (!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { zend_verify_property_type_error(prop_info, Z_STR_P(property), &tmp); From 3f8430e87b4a14520597599aeddea6022ace37c3 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Thu, 7 Apr 2016 06:46:05 +0100 Subject: [PATCH 128/369] use api stuff here --- Zend/zend_object_handlers.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index cc423e74d69e..861c744d4187 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -621,8 +621,8 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ } } if ((type != BP_VAR_IS)) { - if (EXPECTED(!(zobj->ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) || - !(prop_info = zend_hash_find_ptr(&zobj->ce->properties_info, Z_STR_P(member))) || + if (EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) || + !(prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot)) || !prop_info->type)) { zend_error(E_NOTICE,"Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), Z_STRVAL_P(member)); } From f391d866c4982f8852dbeb6ff4d04fab2d6ad842 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Thu, 7 Apr 2016 07:02:26 +0100 Subject: [PATCH 129/369] catch more cases here --- Zend/zend_execute.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index b648ea311d60..3d3276709772 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -184,7 +184,9 @@ zend_bool zend_vm_is_fetching_reference(const zend_op * opline) { case ZEND_NOP: case ZEND_TICKS: case ZEND_EXT_STMT: - case ZEND_FETCH_DIM_W: { + case ZEND_FETCH_DIM_W: + case ZEND_FETCH_W: + case ZEND_FETCH_OBJ_W: { next++; } break; } From 304ff494623bd62d3e2fc9ce8250e5ca3c4ca8b8 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Thu, 7 Apr 2016 07:11:25 +0100 Subject: [PATCH 130/369] nothin to see here ... --- Zend/zend_execute.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 3d3276709772..25bfa3f4d313 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -180,6 +180,7 @@ ZEND_API void* zend_vm_stack_extend(size_t size) zend_bool zend_vm_is_fetching_reference(const zend_op * opline) { zend_op const *next = opline + 1; +_zend_vm_is_fetching_reference: switch (next->opcode) { case ZEND_NOP: case ZEND_TICKS: @@ -188,7 +189,7 @@ zend_bool zend_vm_is_fetching_reference(const zend_op * opline) { case ZEND_FETCH_W: case ZEND_FETCH_OBJ_W: { next++; - } break; + } goto _zend_vm_is_fetching_reference; } switch (next->opcode) { From 2a5daa7ecf04cfab1e3aafacbec824329c251243 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 23 May 2016 11:08:06 +0100 Subject: [PATCH 131/369] improve performance --- Zend/zend_execute.c | 69 +++++++++++++-------------------------------- Zend/zend_execute.h | 49 ++++++++++++++++++++++++++++++-- Zend/zend_types.h | 1 + 3 files changed, 67 insertions(+), 52 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 25bfa3f4d313..3eb27ac8f22a 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -793,53 +793,6 @@ static int zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, zv return 1; } -zend_property_info* zend_object_fetch_property_type_info_ex(zval *object, zend_string *property, void **cache_slot) { - zend_property_info *info = NULL; - - if (cache_slot && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR_EX(cache_slot))) { - zend_property_info *cached = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - - return (cached && cached->type) ? cached : NULL; - } - - info = zend_get_property_info(Z_OBJCE_P(object), property, 1); - - if (UNEXPECTED(info && info != ZEND_WRONG_PROPERTY_INFO && info->type)) { - return info; - } - - return NULL; -} - -zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *property, void **cache_slot) -{ - if (cache_slot && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR_EX(cache_slot))) { - zend_property_info *info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - - return (info && info->type) ? info : NULL; - } - - do { - if (UNEXPECTED(Z_TYPE_P(property) != IS_STRING)) { - break; - } - - if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { - object = Z_REFVAL_P(object); - if (Z_TYPE_P(object) != IS_OBJECT) - break; - } else { - break; - } - } - - return zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); - } while (0); - - return NULL; -} - static inline zend_bool zend_verify_scalar_property_type(zend_uchar type, zval *property, zend_bool strict) { if (EXPECTED(!strict)) { if (UNEXPECTED(!ZEND_SAME_FAKE_TYPE(type, Z_TYPE_P(property)))) { @@ -883,7 +836,12 @@ void zend_verify_property_type_error(zend_property_info *info, zend_string *name } zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) { + if (EXPECTED((Z_TYPE_FLAGS_P(property) & IS_TYPE_VERIFIED) != 0)) { + return 1; + } + if (EXPECTED(ZEND_SAME_FAKE_TYPE(info->type, Z_TYPE_P(property)) && Z_TYPE_P(property) != IS_OBJECT)) { + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; return 1; } @@ -898,23 +856,34 @@ zend_bool zend_verify_property_type(zend_property_info *info, zval *property, ze if (!info->type_ce || Z_TYPE_P(property) != IS_OBJECT || !instanceof_function(Z_OBJCE_P(property), info->type_ce)) { return 0; } + + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; return 1; } case IS_CALLABLE: switch (Z_TYPE_P(property)) { case IS_OBJECT: - if (instanceof_function(zend_ce_closure, Z_OBJCE_P(property))) + if (instanceof_function(zend_ce_closure, Z_OBJCE_P(property))) { + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; return 1; + } + case IS_STRING: case IS_ARRAY: - if (zend_is_callable(property, IS_CALLABLE_CHECK_SILENT, NULL)) + if (zend_is_callable(property, IS_CALLABLE_CHECK_SILENT, NULL)) { + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; return 1; + } + + default: + return 0; } default: if (!zend_verify_scalar_property_type(info->type, property, strict)) { return 0; } + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; return 1; } } @@ -1552,7 +1521,7 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z zptr = z; ZVAL_DEREF(z); SEPARATE_ZVAL_NOREF(z); - + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE(obj)) && Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 2d20865cf90b..b853f4fa5618 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -392,8 +392,53 @@ static zend_always_inline zend_bool _zend_object_has_type_hints(zval *object) { #define ZEND_OBJECT_HAS_TYPE_HINTS(object) _zend_object_has_type_hints(object) -zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *property, void **cache); -zend_property_info* zend_object_fetch_property_type_info_ex(zval *object, zend_string *property, void **cache); +static zend_always_inline zend_property_info* zend_object_fetch_property_type_info_ex(zval *object, zend_string *property, void **cache_slot) { + zend_property_info *info = NULL; + + if (cache_slot && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR_EX(cache_slot))) { + zend_property_info *cached = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + + return (cached && cached->type) ? cached : NULL; + } + + info = zend_get_property_info(Z_OBJCE_P(object), property, 1); + + if (UNEXPECTED(info && info != ZEND_WRONG_PROPERTY_INFO && info->type)) { + return info; + } + + return NULL; +} + +static zend_always_inline zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *property, void **cache_slot) +{ + if (cache_slot && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR_EX(cache_slot))) { + zend_property_info *info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + + return (info && info->type) ? info : NULL; + } + + do { + if (UNEXPECTED(Z_TYPE_P(property) != IS_STRING)) { + break; + } + + if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + if (Z_ISREF_P(object)) { + object = Z_REFVAL_P(object); + if (Z_TYPE_P(object) != IS_OBJECT) + break; + } else { + break; + } + } + + return zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); + } while (0); + + return NULL; +} + zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict); void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property); diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 5207386ccf5e..ec6b399e363b 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -398,6 +398,7 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { #define IS_TYPE_REFCOUNTED (1<<2) #define IS_TYPE_COLLECTABLE (1<<3) #define IS_TYPE_COPYABLE (1<<4) +#define IS_TYPE_VERIFIED (1<<5) /* extended types */ #define IS_INTERNED_STRING_EX IS_STRING From 9461e372701232ae6955d2a04cad3bad7426bd38 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 23 May 2016 11:49:49 +0100 Subject: [PATCH 132/369] cold error path --- Zend/zend_execute.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index b853f4fa5618..fc71c9dd5c48 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -440,7 +440,7 @@ static zend_always_inline zend_property_info* zend_object_fetch_property_type_in } zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict); -void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property); +ZEND_COLD void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property); END_EXTERN_C() From fcaf14ad39d97347815e66d66a86d78a4150a2a3 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 23 May 2016 12:19:29 +0100 Subject: [PATCH 133/369] optimize all the things, thanks @bwoebi --- Zend/zend_execute.c | 8 +- Zend/zend_types.h | 3 + Zend/zend_vm_def.h | 8 +- Zend/zend_vm_execute.h | 176 ++++++++++++++++++++--------------------- 4 files changed, 97 insertions(+), 98 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 3eb27ac8f22a..be80ba0482cd 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -836,10 +836,6 @@ void zend_verify_property_type_error(zend_property_info *info, zend_string *name } zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) { - if (EXPECTED((Z_TYPE_FLAGS_P(property) & IS_TYPE_VERIFIED) != 0)) { - return 1; - } - if (EXPECTED(ZEND_SAME_FAKE_TYPE(info->type, Z_TYPE_P(property)) && Z_TYPE_P(property) != IS_OBJECT)) { Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; return 1; @@ -1522,7 +1518,7 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z ZVAL_DEREF(z); SEPARATE_ZVAL_NOREF(z); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE(obj)) && Z_TYPE_P(property) == IS_STRING)) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE(obj)) && Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); if (prop_info) { @@ -1536,7 +1532,7 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z OBJ_RELEASE(Z_OBJ(obj)); return; } - + binary_op(&tmp, z, value); if (!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { zend_verify_property_type_error(prop_info, Z_STR_P(property), &tmp); diff --git a/Zend/zend_types.h b/Zend/zend_types.h index ec6b399e363b..c5733160ca20 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -473,6 +473,9 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { #define Z_IMMUTABLE(zval) ((Z_TYPE_FLAGS(zval) & IS_TYPE_IMMUTABLE) != 0) #define Z_IMMUTABLE_P(zval_p) Z_IMMUTABLE(*(zval_p)) +#define Z_VERIFIED(zval) ((Z_TYPE_FLAGS(zval) & IS_TYPE_VERIFIED) != 0) +#define Z_VERIFIED_P(zval_p) Z_VERIFIED(*(zval_p)) + /* the following Z_OPT_* macros make better code when Z_TYPE_INFO accessed before */ #define Z_OPT_TYPE(zval) (Z_TYPE_INFO(zval) & Z_TYPE_MASK) #define Z_OPT_TYPE_P(zval_p) Z_OPT_TYPE(*(zval_p)) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index fe5fa525c320..7ff6e0a959eb 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1885,7 +1885,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -2299,7 +2299,7 @@ ZEND_VM_C_LABEL(fast_assign_obj): zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -2395,7 +2395,7 @@ ZEND_VM_C_LABEL(fast_assign_obj): zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -6440,7 +6440,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR) ZSTR_VAL(prop_info->ce->name), ZSTR_VAL(p->key)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, p->key, value); HANDLE_EXCEPTION(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index c15b9f06683f..aa228a737d84 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5698,7 +5698,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -9572,7 +9572,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -11524,7 +11524,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -14053,7 +14053,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -15308,7 +15308,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -15864,7 +15864,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -17361,7 +17361,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE ZSTR_VAL(prop_info->ce->name), ZSTR_VAL(p->key)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, p->key, value); HANDLE_EXCEPTION(); } @@ -18647,7 +18647,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -18893,7 +18893,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -18989,7 +18989,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -19091,7 +19091,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -19187,7 +19187,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -19289,7 +19289,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -19385,7 +19385,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -19487,7 +19487,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -19583,7 +19583,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -23187,7 +23187,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -23433,7 +23433,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -23529,7 +23529,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -23631,7 +23631,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -23727,7 +23727,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -23829,7 +23829,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -23925,7 +23925,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -24027,7 +24027,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -24123,7 +24123,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -25912,7 +25912,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -26158,7 +26158,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -26254,7 +26254,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -26356,7 +26356,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -26452,7 +26452,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -26554,7 +26554,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -26650,7 +26650,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -26752,7 +26752,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -26848,7 +26848,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -28435,7 +28435,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -28753,7 +28753,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -28849,7 +28849,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -28951,7 +28951,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -29047,7 +29047,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -29149,7 +29149,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -29245,7 +29245,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -29347,7 +29347,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -29443,7 +29443,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -31929,7 +31929,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -32247,7 +32247,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -32343,7 +32343,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -32445,7 +32445,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -32541,7 +32541,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -32643,7 +32643,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -32739,7 +32739,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -32841,7 +32841,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -32937,7 +32937,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -34355,7 +34355,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -34674,7 +34674,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -34770,7 +34770,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -34872,7 +34872,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -34968,7 +34968,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -35070,7 +35070,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -35166,7 +35166,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -35268,7 +35268,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -35364,7 +35364,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -39379,7 +39379,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -39792,7 +39792,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -39888,7 +39888,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -39990,7 +39990,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -40086,7 +40086,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -40188,7 +40188,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -40284,7 +40284,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -40386,7 +40386,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -40482,7 +40482,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -45975,7 +45975,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -46388,7 +46388,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -46484,7 +46484,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -46586,7 +46586,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -46682,7 +46682,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -46784,7 +46784,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -46880,7 +46880,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -46982,7 +46982,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -47078,7 +47078,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -49785,7 +49785,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -50199,7 +50199,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -50295,7 +50295,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -50397,7 +50397,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -50493,7 +50493,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -50595,7 +50595,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -50691,7 +50691,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -50793,7 +50793,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -50889,7 +50889,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } From ecfb1e3835c5227ef0964eb957baa34c49ba4d1e Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 23 May 2016 12:43:18 +0100 Subject: [PATCH 134/369] more perf stuff --- Zend/zend_execute.c | 2 +- Zend/zend_vm_def.h | 16 +- Zend/zend_vm_execute.h | 352 ++++++++++++++++++++--------------------- 3 files changed, 185 insertions(+), 185 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index be80ba0482cd..1cb0b2446cd2 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1372,7 +1372,7 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, ZVAL_COPY(result, z); } - if (ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_TYPE_P(property) == IS_STRING) { + if (Z_TYPE_P(property) == IS_STRING && !Z_VERIFIED_P(property) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); if (prop_info) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7ff6e0a959eb..c9f87cd3daa3 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1875,7 +1875,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): } } while (0); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -1885,7 +1885,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -2295,11 +2295,11 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { ZEND_VM_C_LABEL(fast_assign_obj): - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -2391,11 +2391,11 @@ ZEND_VM_C_LABEL(fast_assign_obj): } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -6430,7 +6430,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR) p++; } - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array)) && p->key)) { + if (UNEXPECTED(p->key && !Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(array, p->key, NULL); if (UNEXPECTED(prop_info)) { @@ -6440,7 +6440,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR) ZSTR_VAL(prop_info->ce->name), ZSTR_VAL(p->key)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, p->key, value); HANDLE_EXCEPTION(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index aa228a737d84..d2bfe3d906fd 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5688,7 +5688,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H } } while (0); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -5698,7 +5698,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -9562,7 +9562,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND } } while (0); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -9572,7 +9572,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -11514,7 +11514,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ } } while (0); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -11524,7 +11524,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -14043,7 +14043,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN } } while (0); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -14053,7 +14053,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -15298,7 +15298,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE } } while (0); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -15308,7 +15308,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -15854,7 +15854,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA } } while (0); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -15864,7 +15864,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -17351,7 +17351,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE p++; } - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array)) && p->key)) { + if (UNEXPECTED(p->key && !Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(array, p->key, NULL); if (UNEXPECTED(prop_info)) { @@ -17361,7 +17361,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE ZSTR_VAL(prop_info->ce->name), ZSTR_VAL(p->key)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, p->key, value); HANDLE_EXCEPTION(); } @@ -18637,7 +18637,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN } } while (0); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -18647,7 +18647,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -18889,11 +18889,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -18985,11 +18985,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -19087,11 +19087,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -19183,11 +19183,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -19285,11 +19285,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -19381,11 +19381,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -19483,11 +19483,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -19579,11 +19579,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -23177,7 +23177,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE } } while (0); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -23187,7 +23187,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -23429,11 +23429,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -23525,11 +23525,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -23627,11 +23627,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -23723,11 +23723,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -23825,11 +23825,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -23921,11 +23921,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -24023,11 +24023,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -24119,11 +24119,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -25902,7 +25902,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA } } while (0); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -25912,7 +25912,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -26154,11 +26154,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -26250,11 +26250,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -26352,11 +26352,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -26448,11 +26448,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -26550,11 +26550,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -26646,11 +26646,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -26748,11 +26748,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -26844,11 +26844,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -28425,7 +28425,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ } } while (0); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -28435,7 +28435,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -28749,11 +28749,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -28845,11 +28845,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -28947,11 +28947,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -29043,11 +29043,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -29145,11 +29145,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -29241,11 +29241,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -29343,11 +29343,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -29439,11 +29439,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -31919,7 +31919,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN } } while (0); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -31929,7 +31929,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -32243,11 +32243,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -32339,11 +32339,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -32441,11 +32441,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -32537,11 +32537,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -32639,11 +32639,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -32735,11 +32735,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -32837,11 +32837,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -32933,11 +32933,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -34345,7 +34345,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR } } while (0); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -34355,7 +34355,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -34670,11 +34670,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -34766,11 +34766,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -34868,11 +34868,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -34964,11 +34964,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -35066,11 +35066,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -35162,11 +35162,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -35264,11 +35264,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -35360,11 +35360,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -39369,7 +39369,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND } } while (0); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -39379,7 +39379,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -39788,11 +39788,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -39884,11 +39884,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -39986,11 +39986,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -40082,11 +40082,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -40184,11 +40184,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -40280,11 +40280,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -40382,11 +40382,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -40478,11 +40478,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -45965,7 +45965,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER } } while (0); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -45975,7 +45975,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -46384,11 +46384,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -46480,11 +46480,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -46582,11 +46582,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -46678,11 +46678,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -46780,11 +46780,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -46876,11 +46876,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -46978,11 +46978,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -47074,11 +47074,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -49775,7 +49775,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN } } while (0); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -49785,7 +49785,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(offset)); HANDLE_EXCEPTION(); - } else if (!Z_VERIFIED_P(EX_VAR(opline->result.var)) && !zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { + } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); } @@ -50195,11 +50195,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -50291,11 +50291,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -50393,11 +50393,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -50489,11 +50489,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -50591,11 +50591,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -50687,11 +50687,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -50789,11 +50789,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { fast_assign_obj: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } @@ -50885,11 +50885,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { - if (!Z_VERIFIED_P(value) && !zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } From a3e98d75cffeabb70a81f61b9c269d0590646d61 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 23 May 2016 12:53:21 +0100 Subject: [PATCH 135/369] dtor correct thing --- Zend/zend_execute.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 5c74f5fb4a7b..defe119fd70f 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1611,7 +1611,7 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { zend_verify_property_type_error(prop_info, Z_STR_P(property), &tmp); OBJ_RELEASE(Z_OBJ(obj)); - zval_ptr_dtor(z); + zval_dtor(&tmp); return; } From 19de3fc3cd53dd1f71e9ffb6c136350184c1bf47 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 23 May 2016 12:54:10 +0100 Subject: [PATCH 136/369] dtor tmp --- Zend/zend_execute.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index defe119fd70f..58a5edf4827a 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1691,6 +1691,7 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z if (!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { zend_verify_property_type_error(prop_info, Z_STR_P(property), &tmp); OBJ_RELEASE(Z_OBJ(obj)); + zval_dtor(&tmp); return; } zval_ptr_dtor(z); From fce9549c6be364c81c83532eabd36094f032a264 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 23 May 2016 13:57:23 +0100 Subject: [PATCH 137/369] check correct variable --- Zend/zend_execute.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 58a5edf4827a..36f599a8d1e5 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1526,7 +1526,7 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, ZVAL_COPY(result, z); } - if (Z_TYPE_P(property) == IS_STRING && !Z_VERIFIED_P(property) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) { + if (Z_TYPE_P(property) == IS_STRING && !Z_VERIFIED_P(result) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) { zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); if (prop_info) { From 47003bdf6000c22a09afa12240009131202cdb06 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 23 May 2016 16:18:57 +0200 Subject: [PATCH 138/369] Optimize & fix value reassign --- .../typed_properties_039.phpt | 31 + Zend/zend_execute.c | 35 +- Zend/zend_execute.h | 38 +- Zend/zend_object_handlers.c | 5 +- Zend/zend_vm_def.h | 29 +- Zend/zend_vm_execute.h | 817 +++++++++--------- 6 files changed, 496 insertions(+), 459 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_039.phpt 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 000000000000..2b2513bd925b --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_039.phpt @@ -0,0 +1,31 @@ +--TEST-- +Repeated assign of a variable to mismatched property type must not succeed +--FILE-- +foo = $v; + $v = new A; + $obj = new B; + $obj->foo = $v; +} + +var_dump($objs); + +?> +--EXPECTF-- +Fatal error: Uncaught TypeError: Typed property A::$foo must be integer, A used in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 36f599a8d1e5..fbd4d0d52765 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -843,7 +843,6 @@ void zend_verify_property_type_error(zend_property_info *info, zend_string *name zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) { if (EXPECTED(ZEND_SAME_FAKE_TYPE(info->type, Z_TYPE_P(property)) && Z_TYPE_P(property) != IS_OBJECT)) { - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; return 1; } @@ -859,34 +858,26 @@ zend_bool zend_verify_property_type(zend_property_info *info, zval *property, ze return 0; } - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; return 1; } - case IS_CALLABLE: switch (Z_TYPE_P(property)) { - case IS_OBJECT: - if (instanceof_function(zend_ce_closure, Z_OBJCE_P(property))) { - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; - return 1; - } + case IS_CALLABLE: + switch (Z_TYPE_P(property)) { + case IS_OBJECT: + if (instanceof_function(zend_ce_closure, Z_OBJCE_P(property))) { + return 1; + } - case IS_STRING: - case IS_ARRAY: - if (zend_is_callable(property, IS_CALLABLE_CHECK_SILENT, NULL)) { - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; - return 1; - } + case IS_STRING: + case IS_ARRAY: + return zend_is_callable(property, IS_CALLABLE_CHECK_SILENT, NULL); - default: - return 0; + default: + return 0; } default: - if (!zend_verify_scalar_property_type(info->type, property, strict)) { - return 0; - } - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; - return 1; + return zend_verify_scalar_property_type(info->type, property, strict); } } @@ -1617,6 +1608,7 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, zval_ptr_dtor(z); ZVAL_COPY_VALUE(z, &tmp); + Z_TYPE_FLAGS_P(z) |= IS_TYPE_VERIFIED; if (UNEXPECTED(result)) { ZVAL_COPY(result, z); @@ -1695,6 +1687,7 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z return; } zval_ptr_dtor(z); + Z_TYPE_FLAGS(tmp) |= IS_TYPE_VERIFIED; ZVAL_COPY(z, &tmp); } else { binary_op(z, z, value); diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 07e37b45ff21..19d6f8ea27e6 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -387,12 +387,10 @@ static zend_always_inline zend_bool _zend_object_has_type_hints(zval *object) { #define ZEND_OBJECT_HAS_TYPE_HINTS(object) _zend_object_has_type_hints(object) static zend_always_inline zend_property_info* zend_object_fetch_property_type_info_ex(zval *object, zend_string *property, void **cache_slot) { - zend_property_info *info = NULL; + zend_property_info *info; if (cache_slot && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR_EX(cache_slot))) { - zend_property_info *cached = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - - return (cached && cached->type) ? cached : NULL; + return (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); } info = zend_get_property_info(Z_OBJCE_P(object), property, 1); @@ -406,31 +404,21 @@ static zend_always_inline zend_property_info* zend_object_fetch_property_type_in static zend_always_inline zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *property, void **cache_slot) { - if (cache_slot && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR_EX(cache_slot))) { - zend_property_info *info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - - return (info && info->type) ? info : NULL; + if (UNEXPECTED(Z_TYPE_P(property) != IS_STRING)) { + return NULL; } - do { - if (UNEXPECTED(Z_TYPE_P(property) != IS_STRING)) { - break; - } - - if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { - object = Z_REFVAL_P(object); - if (Z_TYPE_P(object) != IS_OBJECT) - break; - } else { - break; - } + if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { + if (Z_ISREF_P(object)) { + object = Z_REFVAL_P(object); + if (Z_TYPE_P(object) != IS_OBJECT) + return NULL; + } else { + return NULL; } + } - return zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); - } while (0); - - return NULL; + return zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); } zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict); diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index a15c8b6c5cb5..375db9d99f86 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -413,7 +413,9 @@ static zend_always_inline uint32_t zend_get_property_offset(zend_class_entry *ce exit: if (cache_slot) { CACHE_POLYMORPHIC_PTR_EX(cache_slot, ce, (void*)(intptr_t)property_info->offset); - CACHE_PTR_EX(cache_slot + 2, property_info); + if (property_info->type) { + CACHE_PTR_EX(cache_slot + 2, property_info); + } } return property_info->offset; } @@ -757,6 +759,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v } } zend_assign_to_variable(variable_ptr, value, IS_CV); + Z_TYPE_FLAGS_P(variable_ptr) |= IS_TYPE_VERIFIED; /* we can also assign this to untyped properties in order to avoid a ce fetch upon reading */ goto exit; } } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7a0bb3f0bfac..4f77576ba604 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1944,7 +1944,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -1959,6 +1959,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; } ZEND_VM_C_LABEL(fetch_obj_r_exit): @@ -1984,7 +1985,9 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); + + if ((OP2_TYPE != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { @@ -1998,7 +2001,6 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -2274,25 +2276,25 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( if (OP2_TYPE == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; ZEND_VM_C_LABEL(fast_assign_obj): - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, OP_DATA_TYPE); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -2374,7 +2376,7 @@ ZEND_VM_C_LABEL(fast_assign_obj): } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -6161,6 +6163,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR) HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(value) |= IS_TYPE_VERIFIED; } if (opline->result_type & (IS_TMP_VAR|IS_CV)) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 1f8932edfa9b..7d28e106a132 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4995,7 +4995,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -5010,6 +5010,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; } fetch_obj_r_exit: @@ -8847,7 +8848,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -8862,6 +8863,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; } fetch_obj_r_exit: @@ -10785,7 +10787,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -10800,6 +10802,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; } fetch_obj_r_exit: @@ -13295,7 +13298,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -13310,6 +13313,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; } fetch_obj_r_exit: @@ -14546,7 +14550,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -14561,6 +14565,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; } fetch_obj_r_exit: @@ -15100,7 +15105,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -15115,6 +15120,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; } fetch_obj_r_exit: @@ -16610,6 +16616,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(value) |= IS_TYPE_VERIFIED; } if (opline->result_type & (IS_TMP_VAR|IS_CV)) { @@ -18415,7 +18422,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -18430,6 +18437,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; } fetch_obj_r_exit: @@ -18455,7 +18463,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); + + if ((IS_CONST != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { @@ -18469,8 +18479,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -18659,25 +18667,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CONST); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -18759,7 +18767,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -18853,25 +18861,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -18953,7 +18961,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -19047,25 +19055,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19147,7 +19155,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -19241,25 +19249,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CV); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19341,7 +19349,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -23588,7 +23596,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -23603,6 +23611,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; } fetch_obj_r_exit: @@ -23628,7 +23637,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); + + if ((IS_CV != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { @@ -23642,8 +23653,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -23832,25 +23841,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CONST); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -23932,7 +23941,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -24026,25 +24035,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24126,7 +24135,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -24220,25 +24229,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24320,7 +24329,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -24414,25 +24423,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CV); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24514,7 +24523,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -26864,7 +26873,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -26879,6 +26888,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; } fetch_obj_r_exit: @@ -26904,7 +26914,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); + + if (((IS_TMP_VAR|IS_VAR) != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { @@ -26918,7 +26930,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -27108,25 +27119,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CONST); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27208,7 +27219,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -27302,25 +27313,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27402,7 +27413,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -27496,25 +27507,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27596,7 +27607,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -27690,25 +27701,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CV); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27790,7 +27801,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -29701,7 +29712,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -29716,6 +29727,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; } fetch_obj_r_exit: @@ -29741,7 +29753,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); + + if ((IS_CONST != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { @@ -29755,8 +29769,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -30017,25 +30029,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CONST); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -30117,7 +30129,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -30211,25 +30223,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -30311,7 +30323,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -30405,25 +30417,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -30505,7 +30517,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -30599,25 +30611,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CV); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -30699,7 +30711,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -33515,7 +33527,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -33530,6 +33542,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; } fetch_obj_r_exit: @@ -33555,7 +33568,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); + + if ((IS_CV != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { @@ -33569,8 +33584,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -33831,25 +33844,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CONST); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -33931,7 +33944,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -34025,25 +34038,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -34125,7 +34138,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -34219,25 +34232,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -34319,7 +34332,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -34413,25 +34426,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CV); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -34513,7 +34526,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -36215,7 +36228,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -36230,6 +36243,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; } fetch_obj_r_exit: @@ -36255,7 +36269,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); + + if (((IS_TMP_VAR|IS_VAR) != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { @@ -36269,7 +36285,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -36532,25 +36547,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CONST); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -36632,7 +36647,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -36726,25 +36741,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -36826,7 +36841,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -36920,25 +36935,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -37020,7 +37035,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -37114,25 +37129,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CV); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -37214,7 +37229,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -41717,7 +41732,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -41732,6 +41747,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; } fetch_obj_r_exit: @@ -41757,7 +41773,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); + + if ((IS_CONST != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { @@ -41771,8 +41789,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -42046,25 +42062,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CONST); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42146,7 +42162,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -42240,25 +42256,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42340,7 +42356,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -42434,25 +42450,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42534,7 +42550,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -42628,25 +42644,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (IS_CONST == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CV); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42728,7 +42744,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -48937,7 +48953,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -48952,6 +48968,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; } fetch_obj_r_exit: @@ -48977,7 +48994,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); + + if ((IS_CV != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { @@ -48991,8 +49010,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -49266,25 +49283,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CONST); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49366,7 +49383,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -49460,25 +49477,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49560,7 +49577,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -49654,25 +49671,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49754,7 +49771,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -49848,25 +49865,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (IS_CV == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CV); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49948,7 +49965,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -53286,7 +53303,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container)))) { + if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); if (prop_info) { @@ -53301,6 +53318,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN HANDLE_EXCEPTION(); } } + Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; } fetch_obj_r_exit: @@ -53326,7 +53344,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); + + if (((IS_TMP_VAR|IS_VAR) != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); if (UNEXPECTED(prop_info)) { @@ -53340,7 +53360,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -53616,25 +53635,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CONST); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -53716,7 +53735,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -53810,25 +53829,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -53910,7 +53929,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -54004,25 +54023,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_VAR); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -54104,7 +54123,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { @@ -54198,25 +54217,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property_name)))) { - uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property_name) + sizeof(void*)); + void **cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(property_name)); + uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(object); zval *property; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { + zend_property_info *prop_info; fast_assign_obj: - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } + prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { + if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + HANDLE_EXCEPTION(); } } value = zend_assign_to_variable(property, value, IS_CV); + Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -54298,7 +54317,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } /* safety for non standard zend objects */ - if (UNEXPECTED(!Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && Z_OBJ_HT_P(object)->write_property != zend_std_write_property)) { + if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (prop_info) { From 9282b8272e1303e8a241f8d3a9ba4d9f4dfaa177 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 23 May 2016 16:51:55 +0200 Subject: [PATCH 139/369] Easy optimization: constant assignment to objects will always succeed after it succeeded at least once --- Zend/zend_vm_def.h | 4 ++ Zend/zend_vm_execute.h | 144 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 4f77576ba604..b7d2bd94a225 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2292,6 +2292,10 @@ ZEND_VM_C_LABEL(fast_assign_obj): zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (OP_DATA_TYPE == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, OP_DATA_TYPE); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 7d28e106a132..4b511cfbf7be 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18683,6 +18683,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CONST == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CONST); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -18877,6 +18881,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_TMP_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -19071,6 +19079,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -19265,6 +19277,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CV == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CV); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -23857,6 +23873,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CONST == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CONST); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -24051,6 +24071,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_TMP_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -24245,6 +24269,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -24439,6 +24467,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CV == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CV); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -27135,6 +27167,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CONST == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CONST); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -27329,6 +27365,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_TMP_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -27523,6 +27563,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -27717,6 +27761,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CV == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CV); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -30045,6 +30093,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CONST == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CONST); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -30239,6 +30291,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_TMP_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -30433,6 +30489,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -30627,6 +30687,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CV == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CV); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -33860,6 +33924,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CONST == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CONST); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -34054,6 +34122,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_TMP_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -34248,6 +34320,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -34442,6 +34518,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CV == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CV); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -36563,6 +36643,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CONST == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CONST); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -36757,6 +36841,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_TMP_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -36951,6 +37039,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -37145,6 +37237,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CV == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CV); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -42078,6 +42174,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CONST == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CONST); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -42272,6 +42372,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_TMP_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -42466,6 +42570,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -42660,6 +42768,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CV == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CV); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -49299,6 +49411,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CONST == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CONST); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -49493,6 +49609,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_TMP_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -49687,6 +49807,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -49881,6 +50005,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CV == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CV); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -53651,6 +53779,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CONST == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CONST); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -53845,6 +53977,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_TMP_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -54039,6 +54175,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_VAR == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_VAR); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; @@ -54233,6 +54373,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } + /* will remain valid */ + if (IS_CV == IS_CONST) { + CACHE_PTR_EX(cache_slot + 2, NULL); + } } value = zend_assign_to_variable(property, value, IS_CV); Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; From 403dabfa67c9a73c83d2197c306f1c4a4806e829 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 23 May 2016 22:55:44 +0200 Subject: [PATCH 140/369] Optimize property fetching and fix edge cases with __get() --- .../typed_properties_003.phpt | 7 +- .../typed_properties_009.phpt | 9 +- .../typed_properties_036.phpt | 12 +- .../typed_properties_040.phpt | 26 + Zend/zend_API.c | 2 +- Zend/zend_execute.c | 129 +- Zend/zend_execute.h | 23 +- Zend/zend_object_handlers.c | 37 +- Zend/zend_types.h | 4 - Zend/zend_vm_def.h | 100 +- Zend/zend_vm_execute.h | 1033 +++++------------ ext/standard/var.c | 56 +- 12 files changed, 484 insertions(+), 954 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_040.phpt diff --git a/Zend/tests/type_declarations/typed_properties_003.phpt b/Zend/tests/type_declarations/typed_properties_003.phpt index 36337b3066af..90ee16c61323 100644 --- a/Zend/tests/type_declarations/typed_properties_003.phpt +++ b/Zend/tests/type_declarations/typed_properties_003.phpt @@ -9,9 +9,12 @@ $thing = new class() { $var = &$thing->int; ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property class@anonymous::$int must not be referenced in %s:6 +Fatal error: Uncaught TypeError: Typed property class@anonymous::$int must not be accessed before initialization in %s:%d Stack trace: #0 {main} - thrown in %s on line 6 +Next TypeError: Typed property class@anonymous::$int must not be referenced in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_009.phpt b/Zend/tests/type_declarations/typed_properties_009.phpt index 9c0b1ff26d7d..c4c34dc81062 100644 --- a/Zend/tests/type_declarations/typed_properties_009.phpt +++ b/Zend/tests/type_declarations/typed_properties_009.phpt @@ -7,6 +7,7 @@ class Foo { public function __get($name) { var_dump($name); + /* implicit return null, weakly cast to int(0) */ } } @@ -18,10 +19,4 @@ var_dump($foo->bar); ?> --EXPECTF-- string(3) "bar" - -Fatal error: Uncaught TypeError: Typed property Foo::$bar must not be accessed before initialization in %s:14 -Stack trace: -#0 {main} - thrown in %s on line 14 - - +int(0) diff --git a/Zend/tests/type_declarations/typed_properties_036.phpt b/Zend/tests/type_declarations/typed_properties_036.phpt index 4048e370f368..e98c8817a696 100644 --- a/Zend/tests/type_declarations/typed_properties_036.phpt +++ b/Zend/tests/type_declarations/typed_properties_036.phpt @@ -1,19 +1,15 @@ --TEST-- -Test typed properties normal foreach must not yield null +Test unitialized typed properties normal foreach must not be yielded --FILE-- $bar) +foreach ($foo as $key => $bar) { var_dump($key, $bar); +} +?> --EXPECTF-- string(3) "bar" int(10) - -Fatal error: Uncaught TypeError: Typed property class@anonymous::$qux 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_040.phpt b/Zend/tests/type_declarations/typed_properties_040.phpt new file mode 100644 index 000000000000..075fbb1eacfa --- /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-- +bar); +?> +--EXPECTF-- +string(3) "bar" + +Fatal error: Uncaught TypeError: Typed property Foo::$bar must be integer, null used in %s:14 +Stack trace: +#0 {main} + thrown in %s on line 14 + diff --git a/Zend/zend_API.c b/Zend/zend_API.c index d1a33ef54ee9..59d0dd950810 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3626,7 +3626,7 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name } } - if (Z_ISUNDEF_P(property)) { + if (Z_ISUNDEF_P(property) && !optional_type) { ZVAL_NULL(property); } diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index fbd4d0d52765..803a67832250 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -817,9 +817,14 @@ static inline zend_bool zend_verify_scalar_property_type(zend_uchar type, zval * return ZEND_SAME_FAKE_TYPE(type, Z_TYPE_P(property)); } -void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property) { +ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property) { zend_string *resolved = zend_resolve_property_type(info->type_name, info->ce); - + + /* 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; + } + if (info->type == IS_OBJECT) { zend_throw_exception_ex(zend_ce_type_error, info->type, "Typed property %s::$%s must be an instance of %s, %s used", @@ -1517,22 +1522,6 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, ZVAL_COPY(result, z); } - if (Z_TYPE_P(property) == IS_STRING && !Z_VERIFIED_P(result) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); - - if (prop_info) { - if (Z_TYPE_P(result) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property)); - OBJ_RELEASE(Z_OBJ(obj)); - zval_ptr_dtor(z); - return; - } - } - } - ZVAL_DUP(&z_copy, result); if (inc) { increment_function(&z_copy); @@ -1553,10 +1542,9 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, zval *property, void **cache_slot, int inc, zval *result) { zval rv; - zend_property_info *prop_info = NULL; if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) { - zval *z, obj; + zval *z, obj, prev; ZVAL_OBJ(&obj, Z_OBJ_P(object)); Z_ADDREF(obj); @@ -1577,56 +1565,21 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, } ZVAL_DEREF(z); SEPARATE_ZVAL_NOREF(z); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)) && - (Z_TYPE_P(property) == IS_STRING) && - (prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot)))) { - zval tmp; - - if (Z_TYPE_P(z) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property)); - OBJ_RELEASE(Z_OBJ(obj)); - return; - } - - ZVAL_DUP(&tmp, z); - - if (inc) { - increment_function(&tmp); - } else { - decrement_function(&tmp); - } - - if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &tmp); - OBJ_RELEASE(Z_OBJ(obj)); - zval_dtor(&tmp); - return; - } - - zval_ptr_dtor(z); - ZVAL_COPY_VALUE(z, &tmp); - Z_TYPE_FLAGS_P(z) |= IS_TYPE_VERIFIED; - - if (UNEXPECTED(result)) { - ZVAL_COPY(result, z); - } - - Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); + ZVAL_COPY_VALUE(&prev, z); + if (inc) { + increment_function(z); } else { - if (inc) { - increment_function(z); - } else { - decrement_function(z); - } - if (UNEXPECTED(result)) { - ZVAL_COPY(result, z); - } - Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); + decrement_function(z); } - + if (UNEXPECTED(result)) { + ZVAL_COPY(result, z); + } + Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); + + if (UNEXPECTED(EG(exception))) { + ZVAL_COPY_VALUE(z, &prev); + } + OBJ_RELEASE(Z_OBJ(obj)); zval_ptr_dtor(z); } else { @@ -1640,12 +1593,14 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, static zend_never_inline void zend_assign_op_overloaded_property(zval *object, zval *property, void **cache_slot, zval *value, binary_op_type binary_op, zval *result) { zval *z; - zval rv, obj; + zval rv, obj, prev; zval *zptr; ZVAL_OBJ(&obj, Z_OBJ_P(object)); Z_ADDREF(obj); if (EXPECTED(Z_OBJ_HT(obj)->read_property)) { + zend_property_info *prop_info; + z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, cache_slot, &rv); if (UNEXPECTED(EG(exception))) { OBJ_RELEASE(Z_OBJ(obj)); @@ -1664,42 +1619,16 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z ZVAL_DEREF(z); SEPARATE_ZVAL_NOREF(z); - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE(obj)) && Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); - - if (prop_info) { - zval tmp; - - if (Z_TYPE_P(z) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(property)); - OBJ_RELEASE(Z_OBJ(obj)); - return; - } - - binary_op(&tmp, z, value); - if (!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &tmp); - OBJ_RELEASE(Z_OBJ(obj)); - zval_dtor(&tmp); - return; - } - zval_ptr_dtor(z); - Z_TYPE_FLAGS(tmp) |= IS_TYPE_VERIFIED; - ZVAL_COPY(z, &tmp); - } else { - binary_op(z, z, value); - } - } else { - binary_op(z, z, value); - } + ZVAL_COPY_VALUE(&prev, z); + binary_op(z, z, value); Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); if (UNEXPECTED(result)) { ZVAL_COPY(result, z); } + if (UNEXPECTED(EG(exception))) { + ZVAL_COPY_VALUE(z, &prev); + } zval_ptr_dtor(zptr); } else { zend_error(E_WARNING, "Attempt to assign property of non-object"); diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 19d6f8ea27e6..e54e0aafc272 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -388,11 +388,16 @@ static zend_always_inline zend_bool _zend_object_has_type_hints(zval *object) { static zend_always_inline zend_property_info* zend_object_fetch_property_type_info_ex(zval *object, zend_string *property, void **cache_slot) { zend_property_info *info; - - if (cache_slot && EXPECTED(Z_OBJCE_P(object) == CACHED_PTR_EX(cache_slot))) { + + /* if we have a cache_slot, let's assume it's valid. Callers task to ensure validity! */ + if (EXPECTED(cache_slot)) { return (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); } + if (EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + return NULL; + } + info = zend_get_property_info(Z_OBJCE_P(object), property, 1); if (UNEXPECTED(info && info != ZEND_WRONG_PROPERTY_INFO && info->type)) { @@ -404,18 +409,12 @@ static zend_always_inline zend_property_info* zend_object_fetch_property_type_in static zend_always_inline zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *property, void **cache_slot) { - if (UNEXPECTED(Z_TYPE_P(property) != IS_STRING)) { - return NULL; + if (EXPECTED(cache_slot)) { + return (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); } - if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { - object = Z_REFVAL_P(object); - if (Z_TYPE_P(object) != IS_OBJECT) - return NULL; - } else { - return NULL; - } + if (UNEXPECTED(Z_TYPE_P(property) != IS_STRING)) { + return NULL; } return zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 375db9d99f86..e625c970949e 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -682,6 +682,13 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ retval = &EG(uninitialized_zval); } zval_ptr_dtor(&tmp_object); + + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) && + (prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot)))) { + if (!UNEXPECTED(zend_verify_property_type(prop_info, retval, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES) != 0))) { + zend_verify_property_type_error(prop_info, Z_STR_P(member), retval); + } + } goto exit; } else { if (Z_STRVAL_P(member)[0] == '\0') { @@ -698,9 +705,12 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ } } if ((type != BP_VAR_IS)) { - if (EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) || - !(prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot)) || - !prop_info->type)) { + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot))) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(member)); + } else { zend_error(E_NOTICE,"Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), Z_STRVAL_P(member)); } } @@ -747,19 +757,15 @@ 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, Z_STR_P(member))) != NULL) { + zend_property_info *prop_info; found: - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) && Z_TYPE_P(member) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { - zend_verify_property_type_error(prop_info, Z_STR_P(member), value); - goto exit; - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot))) { + if (!zend_verify_property_type(prop_info, value, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { + zend_verify_property_type_error(prop_info, Z_STR_P(member), value); + goto exit; } } zend_assign_to_variable(variable_ptr, value, IS_CV); - Z_TYPE_FLAGS_P(variable_ptr) |= IS_TYPE_VERIFIED; /* we can also assign this to untyped properties in order to avoid a ce fetch upon reading */ goto exit; } } @@ -809,6 +815,13 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v } if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) { + zend_property_info *prop_info; + if (cache_slot ? UNEXPECTED(prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2)) : UNEXPECTED(prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), NULL))) { + if (!zend_verify_property_type(prop_info, value, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { + zend_verify_property_type_error(prop_info, Z_STR_P(member), value); + goto exit; + } + } ZVAL_COPY_VALUE(OBJ_PROP(zobj, property_offset), value); } else { if (!zobj->properties) { diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 81ca927864a6..45c2ebdf70a6 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -395,7 +395,6 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { #define IS_TYPE_REFCOUNTED (1<<2) #define IS_TYPE_COLLECTABLE (1<<3) #define IS_TYPE_COPYABLE (1<<4) -#define IS_TYPE_VERIFIED (1<<5) /* extended types */ #define IS_INTERNED_STRING_EX IS_STRING @@ -472,9 +471,6 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { #define Z_IMMUTABLE(zval) ((Z_TYPE_FLAGS(zval) & IS_TYPE_IMMUTABLE) != 0) #define Z_IMMUTABLE_P(zval_p) Z_IMMUTABLE(*(zval_p)) -#define Z_VERIFIED(zval) ((Z_TYPE_FLAGS(zval) & IS_TYPE_VERIFIED) != 0) -#define Z_VERIFIED_P(zval_p) Z_VERIFIED(*(zval_p)) - /* the following Z_OPT_* macros make better code when Z_TYPE_INFO accessed before */ #define Z_OPT_TYPE(zval) (Z_TYPE_INFO(zval) & Z_TYPE_MASK) #define Z_OPT_TYPE_P(zval_p) Z_OPT_TYPE(*(zval_p)) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b7d2bd94a225..431b1fd53ef3 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1944,24 +1944,6 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); - - if (prop_info) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; - } - ZEND_VM_C_LABEL(fetch_obj_r_exit): FREE_OP2(); FREE_OP1(); @@ -1974,6 +1956,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) zend_free_op free_op1, free_op2; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = GET_OP2_ZVAL_PTR(BP_VAR_R); @@ -1987,17 +1970,13 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if ((OP2_TYPE != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -2015,6 +1994,7 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) zend_free_op free_op1, free_op2; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = GET_OP2_ZVAL_PTR(BP_VAR_R); @@ -2026,21 +2006,18 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -2131,6 +2108,7 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST /* Behave like FETCH_OBJ_W */ zend_free_op free_op1, free_op2; zval *property; + zend_property_info *prop_info; SAVE_OPLINE(); property = GET_OP2_ZVAL_PTR(BP_VAR_R); @@ -2147,20 +2125,17 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST FREE_OP1_VAR_PTR(); HANDLE_EXCEPTION(); } - - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - if (prop_info) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } - } - zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); + + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be passed by reference", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); + } + FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -2292,13 +2267,12 @@ ZEND_VM_C_LABEL(fast_assign_obj): zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (OP_DATA_TYPE == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, OP_DATA_TYPE); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -6152,24 +6126,6 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR) p++; } - if (UNEXPECTED(p->key && !Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(array, p->key, NULL); - - if (UNEXPECTED(prop_info)) { - if (UNEXPECTED(Z_TYPE_P(value) == IS_NULL)) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - ZSTR_VAL(p->key)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, p->key, value); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(value) |= IS_TYPE_VERIFIED; - } - if (opline->result_type & (IS_TMP_VAR|IS_CV)) { if (UNEXPECTED(!p->key)) { ZVAL_LONG(EX_VAR(opline->result.var), p->h); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 4b511cfbf7be..6375301222d6 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4995,24 +4995,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); - - if (prop_info) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; - } - fetch_obj_r_exit: @@ -5100,6 +5082,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; + zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -5117,20 +5100,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (prop_info) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be passed by reference", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -8848,24 +8827,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); - - if (prop_info) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; - } - fetch_obj_r_exit: @@ -8953,6 +8914,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -8970,20 +8932,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (prop_info) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be passed by reference", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -10787,24 +10745,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); - - if (prop_info) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; - } - fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op2); @@ -10893,6 +10833,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ /* Behave like FETCH_OBJ_W */ zend_free_op free_op1, free_op2; zval *property; + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -10910,19 +10851,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (prop_info) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be passed by reference", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -13298,24 +13236,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); - - if (prop_info) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; - } - fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op1); @@ -13331,6 +13251,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; + zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -13348,20 +13269,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (prop_info) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be passed by reference", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -14550,24 +14467,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); - - if (prop_info) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; - } - fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op1); @@ -14583,6 +14482,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -14600,20 +14500,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (prop_info) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be passed by reference", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -15105,24 +15001,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); - - if (prop_info) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; - } - fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op2); zval_ptr_dtor_nogc(free_op1); @@ -15138,6 +15016,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM /* Behave like FETCH_OBJ_W */ zend_free_op free_op1, free_op2; zval *property; + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -15155,19 +15034,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (prop_info) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be passed by reference", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -16601,24 +16477,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE p++; } - if (UNEXPECTED(p->key && !Z_VERIFIED_P(value) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(array, p->key, NULL); - - if (UNEXPECTED(prop_info)) { - if (UNEXPECTED(Z_TYPE_P(value) == IS_NULL)) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - ZSTR_VAL(p->key)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, p->key, value); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(value) |= IS_TYPE_VERIFIED; - } - if (opline->result_type & (IS_TMP_VAR|IS_CV)) { if (UNEXPECTED(!p->key)) { ZVAL_LONG(EX_VAR(opline->result.var), p->h); @@ -18422,24 +18280,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); - - if (prop_info) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; - } - fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op1); @@ -18452,6 +18292,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN zend_free_op free_op1; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -18465,17 +18306,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if ((IS_CONST != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -18492,6 +18329,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA zend_free_op free_op1; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -18503,22 +18341,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -18535,6 +18369,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; + zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -18552,20 +18387,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (prop_info) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be passed by reference", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -18683,13 +18514,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CONST); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -18881,13 +18711,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19079,13 +18908,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19277,13 +19105,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CV); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -23612,24 +23439,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); - - if (prop_info) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; - } - fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op1); @@ -23642,6 +23451,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE zend_free_op free_op1; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -23655,17 +23465,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if ((IS_CV != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -23682,6 +23488,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL zend_free_op free_op1; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -23693,22 +23500,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -23725,6 +23528,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -23742,20 +23546,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (prop_info) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be passed by reference", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -23873,13 +23673,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CONST); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24071,13 +23870,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24269,13 +24067,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24467,13 +24264,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CV); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -26905,24 +26701,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); - - if (prop_info) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; - } - fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op2); zval_ptr_dtor_nogc(free_op1); @@ -26935,6 +26713,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA zend_free_op free_op1, free_op2; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -26948,17 +26727,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (((IS_TMP_VAR|IS_VAR) != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -26976,6 +26751,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H zend_free_op free_op1, free_op2; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -26987,21 +26763,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -27019,6 +26792,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM /* Behave like FETCH_OBJ_W */ zend_free_op free_op1, free_op2; zval *property; + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -27036,19 +26810,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (prop_info) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be passed by reference", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -27167,13 +26938,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CONST); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27365,13 +27135,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27563,13 +27332,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27761,13 +27529,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CV); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -29760,24 +29527,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); - - if (prop_info) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; - } - fetch_obj_r_exit: @@ -29790,6 +29539,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ zend_free_op free_op1; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -29803,17 +29553,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if ((IS_CONST != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -29830,6 +29576,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST zend_free_op free_op1; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -29841,22 +29588,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -29945,6 +29688,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; + zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -29962,20 +29706,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (prop_info) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be passed by reference", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -30093,13 +29833,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CONST); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -30291,13 +30030,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -30489,13 +30227,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -30687,13 +30424,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CV); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -33591,24 +33327,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); - - if (prop_info) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; - } - fetch_obj_r_exit: @@ -33621,6 +33339,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN zend_free_op free_op1; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -33634,17 +33353,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if ((IS_CV != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -33661,6 +33376,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA zend_free_op free_op1; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -33672,22 +33388,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -33776,6 +33488,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -33793,20 +33506,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (prop_info) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be passed by reference", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -33924,13 +33633,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CONST); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -34122,13 +33830,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -34320,13 +34027,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -34518,13 +34224,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CV); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -36308,24 +36013,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); - - if (prop_info) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; - } - fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op2); @@ -36338,6 +36025,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR zend_free_op free_op1, free_op2; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -36351,17 +36039,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (((IS_TMP_VAR|IS_VAR) != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -36379,6 +36063,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA zend_free_op free_op1, free_op2; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -36390,21 +36075,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -36495,6 +36177,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED /* Behave like FETCH_OBJ_W */ zend_free_op free_op1, free_op2; zval *property; + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -36512,19 +36195,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (prop_info) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be passed by reference", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -36643,13 +36323,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CONST); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -36841,13 +36520,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -37039,13 +36717,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -37237,13 +36914,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CV); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -41828,24 +41504,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); - - if (prop_info) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; - } - fetch_obj_r_exit: @@ -41858,6 +41516,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND zend_free_op free_op1; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -41871,17 +41530,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if ((IS_CONST != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -41898,6 +41553,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN zend_free_op free_op1; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -41909,22 +41565,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -42013,6 +41665,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; + zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -42030,20 +41683,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (prop_info) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be passed by reference", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -42174,13 +41823,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CONST); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42372,13 +42020,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42570,13 +42217,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42768,13 +42414,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CV); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49065,24 +48710,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); - - if (prop_info) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; - } - fetch_obj_r_exit: @@ -49095,6 +48722,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER zend_free_op free_op1; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -49108,17 +48736,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if ((IS_CV != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -49135,6 +48759,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE zend_free_op free_op1; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -49146,22 +48771,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -49250,6 +48871,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -49267,20 +48889,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (prop_info) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be passed by reference", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -49411,13 +49029,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CONST); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49609,13 +49226,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49807,13 +49423,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -50005,13 +49620,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CV); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -53431,24 +53045,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN } } while (0); - if (UNEXPECTED(!Z_VERIFIED_P(EX_VAR(opline->result.var)) && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(container))) && EXPECTED(Z_TYPE_P(offset) == IS_STRING)) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); - - if (prop_info) { - if (Z_TYPE_P(EX_VAR(opline->result.var)) == IS_NULL) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(offset)); - HANDLE_EXCEPTION(); - } else if (!zend_verify_property_type(prop_info, EX_VAR(opline->result.var), EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(offset), EX_VAR(opline->result.var)); - HANDLE_EXCEPTION(); - } - } - Z_TYPE_FLAGS_P(EX_VAR(opline->result.var)) |= IS_TYPE_VERIFIED; - } - fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op2); @@ -53461,6 +53057,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN zend_free_op free_op1, free_op2; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -53474,17 +53071,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (((IS_TMP_VAR|IS_VAR) != IS_CONST || UNEXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(property) + 2 * sizeof(void *)) != NULL)) && UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); - - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } @@ -53502,6 +53095,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA zend_free_op free_op1, free_op2; zval *property; zval *container; + zend_property_info *prop_info SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -53513,21 +53107,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info)) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + if (zend_vm_is_fetching_reference(opline)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -53618,6 +53209,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP /* Behave like FETCH_OBJ_W */ zend_free_op free_op1, free_op2; zval *property; + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -53635,19 +53227,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP HANDLE_EXCEPTION(); } - if (UNEXPECTED(ZEND_OBJECT_HAS_TYPE_HINTS(container))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (prop_info) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be passed by reference", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -53779,13 +53368,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CONST); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -53977,13 +53565,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_TMP_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -54175,13 +53762,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_VAR); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -54373,13 +53959,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); HANDLE_EXCEPTION(); } - /* will remain valid */ + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } value = zend_assign_to_variable(property, value, IS_CV); - Z_TYPE_FLAGS_P(property) |= IS_TYPE_VERIFIED; if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } diff --git a/ext/standard/var.c b/ext/standard/var.c index 9c55bd48fd33..3041ca0f8cfe 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -72,12 +72,17 @@ static void php_object_property_dump(zend_property_info *prop_info, zval *zv, ze ZEND_PUTS("]=>\n"); } - if (prop_info && Z_TYPE_P(zv) == IS_NULL) { - php_printf("%*cuninitialized(%s)\n", - level + 1, ' ', - (prop_info->type == IS_OBJECT) ? - ZSTR_VAL(prop_info->type_name) : - zend_get_type_by_const(prop_info->type)); + if (prop_info && Z_TYPE_P(zv) == IS_UNDEF) { + if (prop_info->type) { + php_printf("%*cuninitialized(%s)\n", + level + 1, ' ', + (prop_info->type == IS_OBJECT) ? + ZSTR_VAL(prop_info->type_name) : + zend_get_type_by_const(prop_info->type)); + } else { + php_printf("%*cuninitialized\n", + level + 1, ' '); + } } else { php_var_dump(zv, level + 2); } @@ -164,10 +169,14 @@ PHPAPI void php_var_dump(zval *struc, int level) /* {{{ */ zend_string *key; zval *val; - ZEND_HASH_FOREACH_KEY_VAL_IND(myht, num, key, val) { + ZEND_HASH_FOREACH_KEY_VAL(myht, num, key, val) { zend_property_info *prop_info = NULL; - if (ZEND_OBJECT_HAS_TYPE_HINTS(struc)) { + if (Z_TYPE_P(val) == IS_INDIRECT) { + val = Z_INDIRECT_P(val); + } + + if (key) { prop_info = zend_object_fetch_property_type_info_ex(struc, key, NULL); } @@ -235,7 +244,7 @@ static void zval_array_element_dump(zval *zv, zend_ulong index, zend_string *key } /* }}} */ -static void zval_object_property_dump(zval *zv, zend_ulong index, zend_string *key, int level) /* {{{ */ +static void zval_object_property_dump(zend_property_info *prop_info, zval *zv, zend_ulong index, zend_string *key, int level) /* {{{ */ { const char *prop_name, *class_name; @@ -256,7 +265,20 @@ static void zval_object_property_dump(zval *zv, zend_ulong index, zend_string *k } ZEND_PUTS("]=>\n"); } - php_debug_zval_dump(zv, level + 2); + if (prop_info && Z_TYPE_P(zv) == IS_UNDEF) { + if (prop_info->type) { + php_printf("%*cuninitialized(%s)\n", + level + 1, ' ', + (prop_info->type == IS_OBJECT) ? + ZSTR_VAL(prop_info->type_name) : + zend_get_type_by_const(prop_info->type)); + } else { + php_printf("%*cuninitialized\n", + level + 1, ' '); + } + } else { + php_debug_zval_dump(zv, level + 2); + } } /* }}} */ @@ -335,8 +357,18 @@ PHPAPI void php_debug_zval_dump(zval *struc, int level) /* {{{ */ php_printf("%sobject(%s)#%d (%d) refcount(%u){\n", COMMON, ZSTR_VAL(class_name), Z_OBJ_HANDLE_P(struc), myht ? zend_array_count(myht) : 0, Z_REFCOUNT_P(struc)); zend_string_release(class_name); if (myht) { - ZEND_HASH_FOREACH_KEY_VAL_IND(myht, index, key, val) { - zval_object_property_dump(val, index, key, level); + ZEND_HASH_FOREACH_KEY_VAL(myht, index, key, val) { + zend_property_info *prop_info = NULL; + + if (Z_TYPE_P(val) == IS_INDIRECT) { + val = Z_INDIRECT_P(val); + } + + if (key) { + prop_info = zend_object_fetch_property_type_info_ex(struc, key, NULL); + } + + zval_object_property_dump(prop_info, val, index, key, level); } ZEND_HASH_FOREACH_END(); myht->u.v.nApplyCount--; if (is_temp) { From 6a0e3c9e642ed02953a1b0c0e7568d9c609860cc Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Tue, 24 May 2016 04:09:54 +0200 Subject: [PATCH 141/369] Disallow functions to set references and bad types --- Zend/zend_API.c | 16 ++- Zend/zend_execute.c | 2 - Zend/zend_object_handlers.c | 4 +- ext/standard/basic_functions.c | 4 + ext/standard/basic_functions.h | 1 + .../tests/serialize/typed_property_refs.phpt | 29 +++++ ext/standard/var.c | 12 +- ext/standard/var_unserializer.c | 111 ++++++++++++------ ext/standard/var_unserializer.re | 46 +++++++- 9 files changed, 172 insertions(+), 53 deletions(-) create mode 100644 ext/standard/tests/serialize/typed_property_refs.phpt diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 59d0dd950810..4ac3f8b5865a 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1183,16 +1183,24 @@ ZEND_API void object_properties_init_ex(zend_object *object, HashTable *properti { object->properties = properties; if (object->ce->default_properties_count) { - zval *prop; - zend_string *key; - zend_property_info *property_info; + zval *prop; + zend_string *key; + zend_property_info *property_info; - ZEND_HASH_FOREACH_STR_KEY_VAL(properties, key, prop) { + ZEND_HASH_FOREACH_STR_KEY_VAL(properties, key, prop) { property_info = zend_get_property_info(object->ce, key, 1); if (property_info != ZEND_WRONG_PROPERTY_INFO && property_info && (property_info->flags & ZEND_ACC_STATIC) == 0) { zval *slot = OBJ_PROP(object, property_info->offset); + + if (UNEXPECTED(property_info->type)) { + if (UNEXPECTED(!zend_verify_property_type(property_info, prop, 0))) { + zend_verify_property_type_error(property_info, key, prop); + continue; + } + } + ZVAL_COPY_VALUE(slot, prop); ZVAL_INDIRECT(prop, slot); } diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 803a67832250..402104be4a1a 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1599,8 +1599,6 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z ZVAL_OBJ(&obj, Z_OBJ_P(object)); Z_ADDREF(obj); if (EXPECTED(Z_OBJ_HT(obj)->read_property)) { - zend_property_info *prop_info; - z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, cache_slot, &rv); if (UNEXPECTED(EG(exception))) { OBJ_RELEASE(Z_OBJ(obj)); diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index e625c970949e..a55e54ef4c0a 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -951,9 +951,9 @@ static zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type, fprintf(stderr, "Ptr object #%d property: %s\n", Z_OBJ_HANDLE_P(object), ZSTR_VAL(name)); #endif - if (UNEXPECTED(zobj->ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce))) { zend_property_info *prop_info = zend_hash_find_ptr(&zobj->ce->properties_info, name); - + if (prop_info && prop_info->type) { return NULL; } diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index f887903f268e..47d067794983 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -3742,6 +3742,8 @@ PHP_RINIT_FUNCTION(basic) /* {{{ */ #endif BG(user_shutdown_function_names) = NULL; + zend_hash_init(&BG(unserialize_refs), 8, NULL, ZVAL_PTR_DTOR, 0); + PHP_RINIT(filestat)(INIT_FUNC_ARGS_PASSTHRU); #ifdef HAVE_SYSLOG_H BASIC_RINIT_SUBMODULE(syslog) @@ -3771,6 +3773,8 @@ PHP_RSHUTDOWN_FUNCTION(basic) /* {{{ */ zend_hash_destroy(&BG(putenv_ht)); #endif + zend_hash_destroy(&BG(unserialize_refs)); + if (BG(umask) != -1) { umask(BG(umask)); } diff --git a/ext/standard/basic_functions.h b/ext/standard/basic_functions.h index e37bca31d6dd..674f2aadc3ec 100644 --- a/ext/standard/basic_functions.h +++ b/ext/standard/basic_functions.h @@ -208,6 +208,7 @@ typedef struct _php_basic_globals { struct php_unserialize_data *data; unsigned level; } unserialize; + HashTable unserialize_refs; /* url_scanner_ex.re */ url_adapt_state_ex_t url_adapt_state_ex; diff --git a/ext/standard/tests/serialize/typed_property_refs.phpt b/ext/standard/tests/serialize/typed_property_refs.phpt new file mode 100644 index 000000000000..e6b09214be2c --- /dev/null +++ b/ext/standard/tests/serialize/typed_property_refs.phpt @@ -0,0 +1,29 @@ +--TEST-- +unserialize with references to typed properties shall skip the references or fail +--FILE-- + +--EXPECTF-- +object(A)#1 (2) { + ["a"]=> + int(1) + ["b"]=> + int(1) +} + +Notice: unserialize(): Error at offset 35 of 36 bytes in %s on line %d +bool(false) diff --git a/ext/standard/var.c b/ext/standard/var.c index 3041ca0f8cfe..5c40f1182408 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -72,7 +72,7 @@ static void php_object_property_dump(zend_property_info *prop_info, zval *zv, ze ZEND_PUTS("]=>\n"); } - if (prop_info && Z_TYPE_P(zv) == IS_UNDEF) { + if (Z_TYPE_P(zv) == IS_UNDEF) { if (prop_info->type) { php_printf("%*cuninitialized(%s)\n", level + 1, ' ', @@ -180,7 +180,9 @@ PHPAPI void php_var_dump(zval *struc, int level) /* {{{ */ prop_info = zend_object_fetch_property_type_info_ex(struc, key, NULL); } - php_object_property_dump(prop_info, val, num, key, level); + if (!Z_ISUNDEF_P(val) || prop_info) { + php_object_property_dump(prop_info, val, num, key, level); + } } ZEND_HASH_FOREACH_END(); if (is_temp) { zend_hash_destroy(myht); @@ -368,7 +370,9 @@ PHPAPI void php_debug_zval_dump(zval *struc, int level) /* {{{ */ prop_info = zend_object_fetch_property_type_info_ex(struc, key, NULL); } - zval_object_property_dump(prop_info, val, index, key, level); + if (!Z_ISUNDEF_P(val) || prop_info) { + zval_object_property_dump(prop_info, val, index, key, level); + } } ZEND_HASH_FOREACH_END(); myht->u.v.nApplyCount--; if (is_temp) { @@ -1120,6 +1124,7 @@ PHP_FUNCTION(unserialize) zend_hash_destroy(class_hash); FREE_HASHTABLE(class_hash); } + zend_hash_clean(&BG(unserialize_refs)); zval_ptr_dtor(return_value); if (!EG(exception)) { php_error_docref(NULL, E_NOTICE, "Error at offset " ZEND_LONG_FMT " of %zd bytes", @@ -1141,6 +1146,7 @@ PHP_FUNCTION(unserialize) zend_hash_destroy(class_hash); FREE_HASHTABLE(class_hash); } + zend_hash_clean(&BG(unserialize_refs)); } /* }}} */ diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c index 3fc074dd6ae2..a776e8a404a2 100644 --- a/ext/standard/var_unserializer.c +++ b/ext/standard/var_unserializer.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 */ +/* Generated by re2c 0.14.3 */ #line 1 "ext/standard/var_unserializer.re" /* +----------------------------------------------------------------------+ @@ -301,11 +301,12 @@ static inline size_t parse_uiv(const unsigned char *p) #define UNSERIALIZE_PARAMETER zval *rval, const unsigned char **p, const unsigned char *max, php_unserialize_data_t *var_hash, HashTable *classes #define UNSERIALIZE_PASSTHRU rval, p, max, var_hash, classes -static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, zend_long elements, int objprops) +static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, zend_long elements, zend_class_entry *ce) { while (elements-- > 0) { zval key, *data, d, *old_data; zend_ulong idx; + zend_property_info *info = NULL; ZVAL_UNDEF(&key); @@ -317,7 +318,7 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab data = NULL; ZVAL_UNDEF(&d); - if (!objprops) { + if (!ce) { if (Z_TYPE(key) == IS_LONG) { idx = Z_LVAL(key); numeric_key: @@ -349,9 +350,36 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab if ((old_data = zend_hash_find(ht, Z_STR(key))) != NULL) { if (Z_TYPE_P(old_data) == IS_INDIRECT) { old_data = Z_INDIRECT_P(old_data); + if (Z_STRVAL(key)[0] == 0) { + zend_string *member, *class; + const char *class_name, *prop_name; + size_t prop_name_len; + zend_unmangle_property_name_ex(Z_STR(key), &class_name, &prop_name, &prop_name_len); + member = zend_string_init(prop_name, prop_name_len, 0); + class = zend_string_init(class_name, strlen(class_name), 0); + zend_str_tolower(ZSTR_VAL(class), ZSTR_LEN(class)); + EG(fake_scope) = class_name[0] == '*' ? ce : zend_hash_find_ptr(EG(class_table), class); + info = zend_get_property_info(EG(fake_scope), member, 1); + EG(fake_scope) = NULL; + zend_string_release(member); + zend_string_release(class); + } else { + info = zend_get_property_info(ce, Z_STR(key), 1); + } + var_push_dtor(var_hash, old_data); + old_data = zend_hash_update_ind(ht, Z_STR(key), &d); + + if (EXPECTED(!info->type)) { + info = NULL; + data = old_data; + } else { + /* little hack to disallow references */ + data = zend_hash_next_index_insert(&BG(unserialize_refs), &d); + } + } else { + var_push_dtor(var_hash, old_data); + data = zend_hash_update_ind(ht, Z_STR(key), &d); } - var_push_dtor(var_hash, old_data); - data = zend_hash_update_ind(ht, Z_STR(key), &d); } else { data = zend_hash_add_new(ht, Z_STR(key), &d); } @@ -370,6 +398,14 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab return 0; } + if (UNEXPECTED(info)) { + if (UNEXPECTED(!zend_verify_property_type(info, data, 1))) { + zval_dtor(&key); + return 0; + } + ZVAL_COPY(old_data, data); + } + if (UNEXPECTED(Z_ISUNDEF_P(data))) { if (Z_TYPE(key) == IS_LONG) { zend_hash_index_del(ht, Z_LVAL(key)); @@ -462,7 +498,7 @@ static inline int object_common2(UNSERIALIZE_PARAMETER, zend_long elements) ht = Z_OBJPROP_P(rval); zend_hash_extend(ht, zend_hash_num_elements(ht) + elements, (ht->u.flags & HASH_FLAG_PACKED)); - if (!process_nested_data(UNSERIALIZE_PASSTHRU, ht, elements, 1)) { + if (!process_nested_data(UNSERIALIZE_PASSTHRU, ht, elements, Z_OBJCE_P(rval))) { return 0; } @@ -514,7 +550,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) start = cursor; -#line 518 "ext/standard/var_unserializer.c" +#line 554 "ext/standard/var_unserializer.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -574,9 +610,9 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *(YYMARKER = ++YYCURSOR); if (yych == ':') goto yy95; yy3: -#line 884 "ext/standard/var_unserializer.re" +#line 920 "ext/standard/var_unserializer.re" { return 0; } -#line 580 "ext/standard/var_unserializer.c" +#line 616 "ext/standard/var_unserializer.c" yy4: yych = *(YYMARKER = ++YYCURSOR); if (yych == ':') goto yy89; @@ -619,13 +655,13 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) goto yy3; yy14: ++YYCURSOR; -#line 878 "ext/standard/var_unserializer.re" +#line 914 "ext/standard/var_unserializer.re" { /* this is the case where we have less data than planned */ php_error_docref(NULL, E_NOTICE, "Unexpected end of serialized data"); return 0; /* not sure if it should be 0 or 1 here? */ } -#line 629 "ext/standard/var_unserializer.c" +#line 665 "ext/standard/var_unserializer.c" yy16: yych = *++YYCURSOR; goto yy3; @@ -651,11 +687,12 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) if (yybm[0+yych] & 128) { goto yy20; } - if (yych != ':') goto yy18; + if (yych <= '/') goto yy18; + if (yych >= ';') goto yy18; yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 733 "ext/standard/var_unserializer.re" +#line 769 "ext/standard/var_unserializer.re" { size_t len, len2, len3, maxlen; zend_long elements; @@ -800,7 +837,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) return object_common2(UNSERIALIZE_PASSTHRU, elements); } -#line 804 "ext/standard/var_unserializer.c" +#line 841 "ext/standard/var_unserializer.c" yy25: yych = *++YYCURSOR; if (yych <= ',') { @@ -825,14 +862,14 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 726 "ext/standard/var_unserializer.re" +#line 762 "ext/standard/var_unserializer.re" { if (!var_hash) return 0; return object_common2(UNSERIALIZE_PASSTHRU, object_common1(UNSERIALIZE_PASSTHRU, ZEND_STANDARD_CLASS_DEF_PTR)); } -#line 836 "ext/standard/var_unserializer.c" +#line 873 "ext/standard/var_unserializer.c" yy32: yych = *++YYCURSOR; if (yych == '+') goto yy33; @@ -853,7 +890,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != '{') goto yy18; ++YYCURSOR; -#line 702 "ext/standard/var_unserializer.re" +#line 738 "ext/standard/var_unserializer.re" { zend_long elements = parse_iv(start + 2); /* use iv() not uiv() in order to check data range */ @@ -877,7 +914,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) return finish_nested_data(UNSERIALIZE_PASSTHRU); } -#line 881 "ext/standard/var_unserializer.c" +#line 918 "ext/standard/var_unserializer.c" yy39: yych = *++YYCURSOR; if (yych == '+') goto yy40; @@ -898,7 +935,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 668 "ext/standard/var_unserializer.re" +#line 704 "ext/standard/var_unserializer.re" { size_t len, maxlen; zend_string *str; @@ -932,7 +969,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) ZVAL_STR(rval, str); return 1; } -#line 936 "ext/standard/var_unserializer.c" +#line 973 "ext/standard/var_unserializer.c" yy46: yych = *++YYCURSOR; if (yych == '+') goto yy47; @@ -953,7 +990,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 636 "ext/standard/var_unserializer.re" +#line 672 "ext/standard/var_unserializer.re" { size_t len, maxlen; char *str; @@ -985,7 +1022,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) ZVAL_STRINGL(rval, str, len); return 1; } -#line 989 "ext/standard/var_unserializer.c" +#line 1026 "ext/standard/var_unserializer.c" yy53: yych = *++YYCURSOR; if (yych <= '/') { @@ -1073,7 +1110,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) } yy63: ++YYCURSOR; -#line 627 "ext/standard/var_unserializer.re" +#line 663 "ext/standard/var_unserializer.re" { #if SIZEOF_ZEND_LONG == 4 use_double: @@ -1082,7 +1119,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) ZVAL_DOUBLE(rval, zend_strtod((const char *)start + 2, NULL)); return 1; } -#line 1086 "ext/standard/var_unserializer.c" +#line 1123 "ext/standard/var_unserializer.c" yy65: yych = *++YYCURSOR; if (yych <= ',') { @@ -1141,7 +1178,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != ';') goto yy18; ++YYCURSOR; -#line 611 "ext/standard/var_unserializer.re" +#line 647 "ext/standard/var_unserializer.re" { *p = YYCURSOR; @@ -1157,7 +1194,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) return 1; } -#line 1161 "ext/standard/var_unserializer.c" +#line 1198 "ext/standard/var_unserializer.c" yy76: yych = *++YYCURSOR; if (yych == 'N') goto yy73; @@ -1184,7 +1221,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) if (yych <= '9') goto yy79; if (yych != ';') goto yy18; ++YYCURSOR; -#line 585 "ext/standard/var_unserializer.re" +#line 621 "ext/standard/var_unserializer.re" { #if SIZEOF_ZEND_LONG == 4 int digits = YYCURSOR - start - 3; @@ -1210,7 +1247,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) ZVAL_LONG(rval, parse_iv(start + 2)); return 1; } -#line 1214 "ext/standard/var_unserializer.c" +#line 1251 "ext/standard/var_unserializer.c" yy83: yych = *++YYCURSOR; if (yych <= '/') goto yy18; @@ -1218,22 +1255,22 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != ';') goto yy18; ++YYCURSOR; -#line 579 "ext/standard/var_unserializer.re" +#line 615 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_BOOL(rval, parse_iv(start + 2)); return 1; } -#line 1228 "ext/standard/var_unserializer.c" +#line 1265 "ext/standard/var_unserializer.c" yy87: ++YYCURSOR; -#line 573 "ext/standard/var_unserializer.re" +#line 609 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_NULL(rval); return 1; } -#line 1237 "ext/standard/var_unserializer.c" +#line 1274 "ext/standard/var_unserializer.c" yy89: yych = *++YYCURSOR; if (yych <= ',') { @@ -1256,7 +1293,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) if (yych <= '9') goto yy91; if (yych != ';') goto yy18; ++YYCURSOR; -#line 548 "ext/standard/var_unserializer.re" +#line 584 "ext/standard/var_unserializer.re" { zend_long id; @@ -1281,7 +1318,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) return 1; } -#line 1285 "ext/standard/var_unserializer.c" +#line 1322 "ext/standard/var_unserializer.c" yy95: yych = *++YYCURSOR; if (yych <= ',') { @@ -1304,7 +1341,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) if (yych <= '9') goto yy97; if (yych != ';') goto yy18; ++YYCURSOR; -#line 522 "ext/standard/var_unserializer.re" +#line 558 "ext/standard/var_unserializer.re" { zend_long id; @@ -1330,9 +1367,9 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) return 1; } -#line 1334 "ext/standard/var_unserializer.c" +#line 1371 "ext/standard/var_unserializer.c" } -#line 886 "ext/standard/var_unserializer.re" +#line 922 "ext/standard/var_unserializer.re" return 0; diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 81cc26db9d11..bfc8a359ba6b 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -305,11 +305,12 @@ static inline size_t parse_uiv(const unsigned char *p) #define UNSERIALIZE_PARAMETER zval *rval, const unsigned char **p, const unsigned char *max, php_unserialize_data_t *var_hash, HashTable *classes #define UNSERIALIZE_PASSTHRU rval, p, max, var_hash, classes -static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, zend_long elements, int objprops) +static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, zend_long elements, zend_class_entry *ce) { while (elements-- > 0) { zval key, *data, d, *old_data; zend_ulong idx; + zend_property_info *info = NULL; ZVAL_UNDEF(&key); @@ -321,7 +322,7 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab data = NULL; ZVAL_UNDEF(&d); - if (!objprops) { + if (!ce) { if (Z_TYPE(key) == IS_LONG) { idx = Z_LVAL(key); numeric_key: @@ -353,9 +354,36 @@ string_key: if ((old_data = zend_hash_find(ht, Z_STR(key))) != NULL) { if (Z_TYPE_P(old_data) == IS_INDIRECT) { old_data = Z_INDIRECT_P(old_data); + if (Z_STRVAL(key)[0] == 0) { + zend_string *member, *class; + const char *class_name, *prop_name; + size_t prop_name_len; + zend_unmangle_property_name_ex(Z_STR(key), &class_name, &prop_name, &prop_name_len); + member = zend_string_init(prop_name, prop_name_len, 0); + class = zend_string_init(class_name, strlen(class_name), 0); + zend_str_tolower(ZSTR_VAL(class), ZSTR_LEN(class)); + EG(fake_scope) = class_name[0] == '*' ? ce : zend_hash_find_ptr(EG(class_table), class); + info = zend_get_property_info(EG(fake_scope), member, 1); + EG(fake_scope) = NULL; + zend_string_release(member); + zend_string_release(class); + } else { + info = zend_get_property_info(ce, Z_STR(key), 1); + } + var_push_dtor(var_hash, old_data); + old_data = zend_hash_update_ind(ht, Z_STR(key), &d); + + if (EXPECTED(!info->type)) { + info = NULL; + data = old_data; + } else { + /* little hack to disallow references */ + data = zend_hash_next_index_insert(&BG(unserialize_refs), &d); + } + } else { + var_push_dtor(var_hash, old_data); + data = zend_hash_update_ind(ht, Z_STR(key), &d); } - var_push_dtor(var_hash, old_data); - data = zend_hash_update_ind(ht, Z_STR(key), &d); } else { data = zend_hash_add_new(ht, Z_STR(key), &d); } @@ -374,6 +402,14 @@ string_key: return 0; } + if (UNEXPECTED(info)) { + if (UNEXPECTED(!zend_verify_property_type(info, data, 1))) { + zval_dtor(&key); + return 0; + } + ZVAL_COPY(old_data, data); + } + if (UNEXPECTED(Z_ISUNDEF_P(data))) { if (Z_TYPE(key) == IS_LONG) { zend_hash_index_del(ht, Z_LVAL(key)); @@ -466,7 +502,7 @@ static inline int object_common2(UNSERIALIZE_PARAMETER, zend_long elements) ht = Z_OBJPROP_P(rval); zend_hash_extend(ht, zend_hash_num_elements(ht) + elements, (ht->u.flags & HASH_FLAG_PACKED)); - if (!process_nested_data(UNSERIALIZE_PASSTHRU, ht, elements, 1)) { + if (!process_nested_data(UNSERIALIZE_PASSTHRU, ht, elements, Z_OBJCE_P(rval))) { return 0; } From 7eeda097ca7447cdd861d2a0459573498538ab4c Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 24 May 2016 06:19:09 +0100 Subject: [PATCH 142/369] missing colons --- Zend/zend_vm_def.h | 4 ++-- Zend/zend_vm_execute.h | 36 ++++++++++++++++++------------------ 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 431b1fd53ef3..77d17cc27382 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1956,7 +1956,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) zend_free_op free_op1, free_op2; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = GET_OP2_ZVAL_PTR(BP_VAR_R); @@ -1994,7 +1994,7 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) zend_free_op free_op1, free_op2; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = GET_OP2_ZVAL_PTR(BP_VAR_R); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6375301222d6..a61213a55755 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18292,7 +18292,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -18329,7 +18329,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -23451,7 +23451,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -23488,7 +23488,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -26713,7 +26713,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA zend_free_op free_op1, free_op2; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -26751,7 +26751,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H zend_free_op free_op1, free_op2; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -29539,7 +29539,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -29576,7 +29576,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -33339,7 +33339,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -33376,7 +33376,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -36025,7 +36025,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR zend_free_op free_op1, free_op2; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -36063,7 +36063,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA zend_free_op free_op1, free_op2; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -41516,7 +41516,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -41553,7 +41553,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -48722,7 +48722,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -48759,7 +48759,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -53057,7 +53057,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN zend_free_op free_op1, free_op2; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -53095,7 +53095,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA zend_free_op free_op1, free_op2; zval *property; zval *container; - zend_property_info *prop_info + zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); From ce442f988220157e263b5d126aa8d3003afa8690 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 24 May 2016 12:59:54 +0300 Subject: [PATCH 143/369] Fixed white-spaces --- .../typed_properties_001.phpt | 2 +- .../typed_properties_004.phpt | 2 +- .../typed_properties_005.phpt | 2 +- .../typed_properties_034.phpt | 4 ++-- Zend/zend_API.c | 2 +- Zend/zend_ast.c | 2 +- Zend/zend_compile.c | 6 +++--- Zend/zend_execute.c | 12 +++++------ Zend/zend_execute.h | 2 +- Zend/zend_execute_API.c | 4 ++-- Zend/zend_inheritance.c | 7 +++---- Zend/zend_language_parser.y | 2 +- Zend/zend_vm_def.h | 2 +- ext/reflection/php_reflection.c | 20 +++++++++---------- ext/reflection/tests/ReflectionType_001.phpt | 2 +- .../tests/serialize/typed_property_refs.phpt | 4 ++-- ext/standard/var.c | 12 +++++------ 17 files changed, 42 insertions(+), 45 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_001.phpt b/Zend/tests/type_declarations/typed_properties_001.phpt index 054fc4df3ba6..5a346a4c3e80 100644 --- a/Zend/tests/type_declarations/typed_properties_001.phpt +++ b/Zend/tests/type_declarations/typed_properties_001.phpt @@ -8,7 +8,7 @@ var_dump(new class(1, 2.2, true, ["four"], new stdClass) { public bool $bool; public array $array; public stdClass $std; - + public function __construct(int $int, float $float, bool $bool, array $array, stdClass $std) { $this->int = $int; $this->float = $float; diff --git a/Zend/tests/type_declarations/typed_properties_004.phpt b/Zend/tests/type_declarations/typed_properties_004.phpt index 59314ab8dad1..1d9e6400e00f 100644 --- a/Zend/tests/type_declarations/typed_properties_004.phpt +++ b/Zend/tests/type_declarations/typed_properties_004.phpt @@ -4,7 +4,7 @@ Test typed properties error condition (type mismatch) int = $string; } diff --git a/Zend/tests/type_declarations/typed_properties_005.phpt b/Zend/tests/type_declarations/typed_properties_005.phpt index 05de2251c972..b521963000d5 100644 --- a/Zend/tests/type_declarations/typed_properties_005.phpt +++ b/Zend/tests/type_declarations/typed_properties_005.phpt @@ -6,7 +6,7 @@ class Dummy {} new class(new Dummy) { public stdClass $std; - + public function __construct(Dummy $dummy) { $this->std = $dummy; } diff --git a/Zend/tests/type_declarations/typed_properties_034.phpt b/Zend/tests/type_declarations/typed_properties_034.phpt index 64a6c5d8deaa..dc6d58170d00 100644 --- a/Zend/tests/type_declarations/typed_properties_034.phpt +++ b/Zend/tests/type_declarations/typed_properties_034.phpt @@ -5,12 +5,12 @@ Test typed properties add array element guard $foo = new class { public int $bar = 42; - + public function getIterator() { foreach(['1', &$this->bar] as $item) { - yield $item; + yield $item; } } }; diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 4ac3f8b5865a..43cfd4b94c91 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3693,7 +3693,7 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name property_info->doc_comment = doc_comment; property_info->ce = ce; property_info->type = optional_type; - property_info->type_name = optional_type_name ? + property_info->type_name = optional_type_name ? zend_new_interned_string(optional_type_name) : NULL; property_info->type_ce = NULL; diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 1c4f619f1f99..fb40acd6bf01 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -1150,7 +1150,7 @@ static void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int str, type_ast, 0, indent); smart_str_appendc(str, ' '); } - + goto simple_list; } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index c5116ed699c4..210166847894 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5508,7 +5508,7 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ "Typed property %s::$%s must not be static", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - } + } if (type_ast->kind == ZEND_AST_TYPE) { optional_type = type_ast->attr; @@ -5547,7 +5547,7 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ } } } - + /* Doc comment has been appended as last element in ZEND_AST_PROP_ELEM ast */ if (doc_comment_ast) { doc_comment = zend_string_copy(zend_ast_get_str(doc_comment_ast)); @@ -5570,7 +5570,7 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ if (optional_type && !Z_CONSTANT(value_zv)) { if (optional_type == IS_ARRAY) { if (Z_TYPE(value_zv) != IS_ARRAY) { - zend_error_noreturn(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "Default value for properties with array type can only be an array"); } } else if (optional_type == IS_CALLABLE) { diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 402104be4a1a..454d29751ec4 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -187,7 +187,7 @@ zend_bool zend_vm_is_fetching_reference(const zend_op * opline) { case ZEND_TICKS: case ZEND_EXT_STMT: case ZEND_FETCH_DIM_W: - case ZEND_FETCH_W: + case ZEND_FETCH_W: case ZEND_FETCH_OBJ_W: { next++; } goto _zend_vm_is_fetching_reference; @@ -197,8 +197,8 @@ zend_bool zend_vm_is_fetching_reference(const zend_op * opline) { case ZEND_SEND_REF: case ZEND_RETURN_BY_REF: case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_ADD_ARRAY_ELEMENT: + case ZEND_INIT_ARRAY: + case ZEND_ADD_ARRAY_ELEMENT: case ZEND_YIELD: { return 1; } break; @@ -826,7 +826,7 @@ ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_i } if (info->type == IS_OBJECT) { - zend_throw_exception_ex(zend_ce_type_error, info->type, + zend_throw_exception_ex(zend_ce_type_error, info->type, "Typed property %s::$%s must be an instance of %s, %s used", ZSTR_VAL(info->ce->name), ZSTR_VAL(name), @@ -835,7 +835,7 @@ ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_i ZSTR_VAL(Z_OBJCE_P(property)->name) : zend_get_type_by_const(Z_TYPE_P(property))); } else { - zend_throw_exception_ex(zend_ce_type_error, info->type, + zend_throw_exception_ex(zend_ce_type_error, info->type, "Typed property %s::$%s must be %s, %s used", ZSTR_VAL(info->ce->name), ZSTR_VAL(name), @@ -854,7 +854,7 @@ zend_bool zend_verify_property_type(zend_property_info *info, zval *property, ze switch (info->type) { case IS_OBJECT: { zend_string *resolved = zend_resolve_property_type(info->type_name, info->ce); - + if (!info->type_ce) { info->type_ce = zend_lookup_class(resolved); } diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index e54e0aafc272..ffd3c936e246 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -374,7 +374,7 @@ static zend_always_inline zend_bool _zend_object_has_type_hints(zval *object) { if (Z_TYPE_P(object) != IS_OBJECT) break; } else { - break; + break; } } diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 1403e1985895..a70ae05c88c6 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -126,11 +126,11 @@ static int clean_non_persistent_type_info(zval *zv) /* {{{ */ prop_info->type_ce = NULL; } } ZEND_HASH_FOREACH_END(); - } + } return ZEND_HASH_APPLY_KEEP; } - return ZEND_HASH_APPLY_STOP; + return ZEND_HASH_APPLY_STOP; } /* }}} */ static int clean_non_persistent_class(zval *zv) /* {{{ */ diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 0ff48147ebe1..d14d190b83e5 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -657,7 +657,7 @@ zend_string* zend_resolve_property_type(zend_string *name, zend_class_entry *sco if (!type) { return NULL; } - + if (zend_string_equals_literal_ci(type, "parent")) { if (scope && scope->parent) { return scope->parent->name; @@ -680,7 +680,6 @@ 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))) { child_info->flags |= ZEND_ACC_CHANGED; } else { @@ -711,8 +710,8 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke if (!(child_info->flags & ZEND_ACC_CHANGED)) { if (UNEXPECTED(parent_info->type && !(parent_info->flags & ZEND_ACC_PRIVATE))) { if (parent_info->type == IS_OBJECT) { - if (child_info->type != IS_OBJECT || - !zend_string_equals_ci(zend_resolve_property_type(parent_info->type_name, parent_info->ce), + if (child_info->type != IS_OBJECT || + !zend_string_equals_ci(zend_resolve_property_type(parent_info->type_name, parent_info->ce), zend_resolve_property_type(child_info->type_name, child_info->ce))) { zend_error_noreturn(E_COMPILE_ERROR, "Type of %s::$%s must be %s (as in class %s)", diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index d57e488166fa..4939051d0941 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -712,7 +712,7 @@ class_statement_list: class_statement: variable_modifiers optional_type property_list ';' - { $3->attr = $1; + { $3->attr = $1; $$ = zend_ast_create(ZEND_AST_PROP_GROUP, $2, $3); } | method_modifiers T_CONST class_const_list ';' { $$ = $3; $$->attr = $1; } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 77d17cc27382..f7b5f35f75c8 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -5925,7 +5925,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); HANDLE_EXCEPTION(); } - + if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) { if (array_ptr == array_ref) { diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 0f2c3feb7300..3150c7d95157 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -1287,17 +1287,17 @@ static void reflection_type_factory(void *scope, zval *closure_object, void *inf reference->type = type; intern->ptr = reference; intern->ref_type = REF_TYPE_TYPE; - + switch (type) { case REF_INFO_ARG: { zend_function *fptr = (zend_function*) scope; - + reference->scope.fptr = fptr; intern->ce = fptr->common.scope; reference->info.arg = info; } break; - + case REF_INFO_PROP: reference->scope.ce = scope; intern->ce = scope; @@ -3002,14 +3002,12 @@ ZEND_METHOD(reflection_type, allowsNull) GET_REFLECTION_OBJECT_PTR(param); switch (param->type) { - case REF_INFO_ARG: { + case REF_INFO_ARG: RETVAL_BOOL(param->info.arg->allow_null); - } break; - - + break; case REF_INFO_PROP: RETVAL_FALSE; - break; + break; } } /* }}} */ @@ -3045,7 +3043,7 @@ ZEND_METHOD(reflection_type, __toString) reflection_object *intern; type_reference *param; zend_uchar type = IS_UNDEF; - + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -3058,7 +3056,7 @@ ZEND_METHOD(reflection_type, __toString) if (type == IS_OBJECT) { zend_function *fptr = param->scope.fptr; - if (fptr->type == ZEND_INTERNAL_FUNCTION && + if (fptr->type == ZEND_INTERNAL_FUNCTION && !(fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO)) { RETURN_STRING(((zend_internal_arg_info*) param->info.arg)->class_name); } else RETURN_STR_COPY(param->info.arg->class_name); @@ -5883,7 +5881,7 @@ ZEND_METHOD(reflection_property, getType) if (!ref->prop.type) { RETURN_NULL(); } - + reflection_type_factory(ref->prop.ce, Z_ISUNDEF(intern->obj) ? NULL : &intern->obj, &ref->prop, REF_INFO_PROP, return_value); } /* }}} */ diff --git a/ext/reflection/tests/ReflectionType_001.phpt b/ext/reflection/tests/ReflectionType_001.phpt index 01fdd948824d..158ecb6b5ef6 100644 --- a/ext/reflection/tests/ReflectionType_001.phpt +++ b/ext/reflection/tests/ReflectionType_001.phpt @@ -90,7 +90,7 @@ $reflector = new ReflectionClass(PropTypeTest::class); foreach ($reflector->getProperties() as $name => $property) { if ($property->hasType()) { - printf("public %s $%s;\n", + printf("public %s $%s;\n", $property->getType(), $property->getName()); } else printf("public $%s;\n", $property->getName()); } diff --git a/ext/standard/tests/serialize/typed_property_refs.phpt b/ext/standard/tests/serialize/typed_property_refs.phpt index e6b09214be2c..a05a8e53af51 100644 --- a/ext/standard/tests/serialize/typed_property_refs.phpt +++ b/ext/standard/tests/serialize/typed_property_refs.phpt @@ -13,8 +13,8 @@ class B { public int $b; } -var_dump(unserialize('O:1:"A":2:{s:1:"a";i:1;s:1:"b";R:2;}')); -var_dump(unserialize('O:1:"B":2:{s:1:"a";i:1;s:1:"b";R:2;}')); +var_dump(unserialize('O:1:"A":2:{s:1:"a";i:1;s:1:"b";R:2;}')); +var_dump(unserialize('O:1:"B":2:{s:1:"a";i:1;s:1:"b";R:2;}')); ?> --EXPECTF-- diff --git a/ext/standard/var.c b/ext/standard/var.c index 5c40f1182408..f5b57862ca10 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -74,13 +74,13 @@ static void php_object_property_dump(zend_property_info *prop_info, zval *zv, ze if (Z_TYPE_P(zv) == IS_UNDEF) { if (prop_info->type) { - php_printf("%*cuninitialized(%s)\n", + php_printf("%*cuninitialized(%s)\n", level + 1, ' ', (prop_info->type == IS_OBJECT) ? - ZSTR_VAL(prop_info->type_name) : + ZSTR_VAL(prop_info->type_name) : zend_get_type_by_const(prop_info->type)); } else { - php_printf("%*cuninitialized\n", + php_printf("%*cuninitialized\n", level + 1, ' '); } } else { @@ -269,13 +269,13 @@ static void zval_object_property_dump(zend_property_info *prop_info, zval *zv, z } if (prop_info && Z_TYPE_P(zv) == IS_UNDEF) { if (prop_info->type) { - php_printf("%*cuninitialized(%s)\n", + php_printf("%*cuninitialized(%s)\n", level + 1, ' ', (prop_info->type == IS_OBJECT) ? - ZSTR_VAL(prop_info->type_name) : + ZSTR_VAL(prop_info->type_name) : zend_get_type_by_const(prop_info->type)); } else { - php_printf("%*cuninitialized\n", + php_printf("%*cuninitialized\n", level + 1, ' '); } } else { From 25ed1f257eafcf11e96222aaf2acc21165f8f259 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 24 May 2016 13:26:17 +0300 Subject: [PATCH 144/369] Revert insignificant formatting changes to minimize the patch against master --- Zend/zend_execute.c | 2 - Zend/zend_vm_def.h | 41 ++-- Zend/zend_vm_execute.h | 434 ++++++++++++++++------------------------- 3 files changed, 182 insertions(+), 295 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 454d29751ec4..816fcc364f86 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1521,7 +1521,6 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, } else { ZVAL_COPY(result, z); } - ZVAL_DUP(&z_copy, result); if (inc) { increment_function(&z_copy); @@ -1529,7 +1528,6 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *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); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index f7b5f35f75c8..f98a8478dbd4 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -735,28 +735,26 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - break; - } - - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - - binary_op(zptr, zptr, value); + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } } } else { zend_assign_op_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while(0); + } while (0); FREE_OP(free_op_data1); FREE_OP2(); @@ -1172,7 +1170,8 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -1195,7 +1194,6 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, decrement_function(zptr); } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -1226,7 +1224,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_free_op free_op1, free_op2; zval *object; zval *property; - zval *zptr = NULL; + zval *zptr; SAVE_OPLINE(); object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW); @@ -1251,7 +1249,8 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -1919,13 +1918,13 @@ ZEND_VM_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - ZEND_VM_C_GOTO(fetch_obj_r_exit); + break; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - ZEND_VM_C_GOTO(fetch_obj_r_exit); + break; } } } @@ -1934,7 +1933,6 @@ ZEND_VM_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR ZEND_VM_C_LABEL(fetch_obj_r_no_object): zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); - ZEND_VM_C_GOTO(fetch_obj_r_exit); } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -1944,7 +1942,6 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): } } while (0); -ZEND_VM_C_LABEL(fetch_obj_r_exit): FREE_OP2(); FREE_OP1(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -2005,7 +2002,6 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) FREE_OP2(); HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { @@ -2370,7 +2366,6 @@ ZEND_VM_C_LABEL(fast_assign_obj): if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (OP_DATA_TYPE == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -5741,7 +5736,6 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) break; } } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -6125,7 +6119,6 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR) pos++; p++; } - if (opline->result_type & (IS_TMP_VAR|IS_CV)) { if (UNEXPECTED(!p->key)) { ZVAL_LONG(EX_VAR(opline->result.var), p->h); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a61213a55755..76ad23d7abcd 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4970,13 +4970,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } } @@ -4985,7 +4985,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); - goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -4995,8 +4994,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H } } while (0); -fetch_obj_r_exit: - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -8802,13 +8799,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } } @@ -8817,7 +8814,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); - goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -8827,8 +8823,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND } } while (0); -fetch_obj_r_exit: - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -10720,13 +10714,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } } @@ -10735,7 +10729,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); - goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -10745,7 +10738,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ } } while (0); -fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -13211,13 +13203,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } } @@ -13226,7 +13218,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); - goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -13236,8 +13227,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN } } while (0); -fetch_obj_r_exit: - zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -14442,13 +14431,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } } @@ -14457,7 +14446,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); - goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -14467,8 +14455,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE } } while (0); -fetch_obj_r_exit: - zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -14976,13 +14962,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } } @@ -14991,7 +14977,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); - goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -15001,7 +14986,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA } } while (0); -fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op2); zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -16476,7 +16460,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE pos++; p++; } - if (opline->result_type & (IS_TMP_VAR|IS_CV)) { if (UNEXPECTED(!p->key)) { ZVAL_LONG(EX_VAR(opline->result.var), p->h); @@ -17085,28 +17068,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - break; - } - - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - - binary_op(zptr, zptr, value); + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } } } else { zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while(0); + } while (0); FREE_OP(free_op_data1); @@ -18000,7 +17981,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -18023,7 +18005,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -18053,7 +18034,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_free_op free_op1; zval *object; zval *property; - zval *zptr = NULL; + zval *zptr; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -18078,7 +18059,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -18255,13 +18237,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } } @@ -18270,7 +18252,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); - goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -18280,8 +18261,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN } } while (0); -fetch_obj_r_exit: - zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -18340,7 +18319,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { @@ -18617,7 +18595,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -18814,7 +18791,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -19011,7 +18987,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -19208,7 +19183,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -20186,7 +20160,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDL break; } } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -22244,28 +22217,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - break; - } - - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - - binary_op(zptr, zptr, value); + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } } } else { zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while(0); + } while (0); FREE_OP(free_op_data1); @@ -23159,7 +23130,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -23182,7 +23154,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -23212,7 +23183,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_free_op free_op1; zval *object; zval *property; - zval *zptr = NULL; + zval *zptr; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -23237,7 +23208,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -23414,13 +23386,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } } @@ -23429,7 +23401,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); - goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -23439,8 +23410,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE } } while (0); -fetch_obj_r_exit: - zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -23499,7 +23468,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { @@ -23776,7 +23744,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -23973,7 +23940,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -24170,7 +24136,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -24367,7 +24332,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -25318,7 +25282,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER( break; } } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -25502,28 +25465,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - break; - } - - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - - binary_op(zptr, zptr, value); + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } } } else { zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while(0); + } while (0); FREE_OP(free_op_data1); zval_ptr_dtor_nogc(free_op2); @@ -26419,7 +26380,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -26442,7 +26404,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -26473,7 +26434,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_free_op free_op1, free_op2; zval *object; zval *property; - zval *zptr = NULL; + zval *zptr; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -26498,7 +26459,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -26676,13 +26638,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } } @@ -26691,7 +26653,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); - goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -26701,7 +26662,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA } } while (0); -fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op2); zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -26762,7 +26722,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { @@ -27041,7 +27000,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -27238,7 +27196,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -27435,7 +27392,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -27632,7 +27588,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -28474,7 +28429,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR_HAND break; } } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -28693,28 +28647,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - break; - } - - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - - binary_op(zptr, zptr, value); + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } } } else { zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while(0); + } while (0); FREE_OP(free_op_data1); @@ -29338,7 +29290,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -29361,7 +29314,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -29391,7 +29343,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; - zval *zptr = NULL; + zval *zptr; SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); @@ -29416,7 +29368,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -29502,13 +29455,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } } @@ -29517,7 +29470,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); - goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -29527,8 +29479,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ } } while (0); -fetch_obj_r_exit: - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -29587,7 +29537,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { @@ -29936,7 +29885,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -30133,7 +30081,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -30330,7 +30277,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -30527,7 +30473,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -31132,7 +31077,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HA break; } } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -32493,28 +32437,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - break; - } - - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - - binary_op(zptr, zptr, value); + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } } } else { zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while(0); + } while (0); FREE_OP(free_op_data1); @@ -33138,7 +33080,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -33161,7 +33104,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -33191,7 +33133,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; - zval *zptr = NULL; + zval *zptr; SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); @@ -33216,7 +33158,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -33302,13 +33245,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } } @@ -33317,7 +33260,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); - goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -33327,8 +33269,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN } } while (0); -fetch_obj_r_exit: - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -33387,7 +33327,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { @@ -33736,7 +33675,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -33933,7 +33871,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -34130,7 +34067,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -34327,7 +34263,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -34807,7 +34742,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDL break; } } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -35176,28 +35110,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - break; - } - - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - - binary_op(zptr, zptr, value); + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } } } else { zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while(0); + } while (0); FREE_OP(free_op_data1); zval_ptr_dtor_nogc(free_op2); @@ -35822,7 +35754,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -35845,7 +35778,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -35876,7 +35808,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_free_op free_op2; zval *object; zval *property; - zval *zptr = NULL; + zval *zptr; SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); @@ -35901,7 +35833,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -35988,13 +35921,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } } @@ -36003,7 +35936,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); - goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -36013,7 +35945,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR } } while (0); -fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -36074,7 +36005,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { @@ -36426,7 +36356,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -36623,7 +36552,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -36820,7 +36748,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -37017,7 +36944,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -37499,7 +37425,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR_H break; } } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -40120,28 +40045,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - break; - } - - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - - binary_op(zptr, zptr, value); + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } } } else { zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while(0); + } while (0); FREE_OP(free_op_data1); @@ -41035,7 +40958,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -41058,7 +40982,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -41088,7 +41011,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; - zval *zptr = NULL; + zval *zptr; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); @@ -41113,7 +41036,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -41479,13 +41403,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } } @@ -41494,7 +41418,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); - goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -41504,8 +41427,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND } } while (0); -fetch_obj_r_exit: - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -41564,7 +41485,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { @@ -41926,7 +41846,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -42123,7 +42042,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -42320,7 +42238,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -42517,7 +42434,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -43577,7 +43493,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLE break; } } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -47465,28 +47380,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - break; - } - - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - - binary_op(zptr, zptr, value); + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } } } else { zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while(0); + } while (0); FREE_OP(free_op_data1); @@ -48380,7 +48293,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -48403,7 +48317,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -48433,7 +48346,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; - zval *zptr = NULL; + zval *zptr; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); @@ -48458,7 +48371,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -48685,13 +48599,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } } @@ -48700,7 +48614,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); - goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -48710,8 +48623,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER } } while (0); -fetch_obj_r_exit: - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -48770,7 +48681,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { @@ -49132,7 +49042,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -49329,7 +49238,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -49526,7 +49434,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -49723,7 +49630,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -50778,7 +50684,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(Z break; } } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { @@ -51796,28 +51701,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { - if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - break; - } - - ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - - binary_op(zptr, zptr, value); + } else { + ZVAL_DEREF(zptr); + SEPARATE_ZVAL_NOREF(zptr); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + binary_op(zptr, zptr, value); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), zptr); + } } } else { zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } - } while(0); + } while (0); FREE_OP(free_op_data1); zval_ptr_dtor_nogc(free_op2); @@ -52713,7 +52616,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -52736,7 +52640,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE decrement_function(zptr); } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } @@ -52767,7 +52670,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_free_op free_op2; zval *object; zval *property; - zval *zptr = NULL; + zval *zptr; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); @@ -52792,7 +52695,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP /* here we are sure we are dealing with an object */ - if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr && !ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) + if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) + && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -53020,13 +52924,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN retval = OBJ_PROP(zobj, prop_offset); if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } else if (EXPECTED(zobj->properties != NULL)) { retval = zend_hash_find(zobj->properties, Z_STR_P(offset)); if (EXPECTED(retval)) { ZVAL_COPY(EX_VAR(opline->result.var), retval); - goto fetch_obj_r_exit; + break; } } } @@ -53035,7 +52939,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN fetch_obj_r_no_object: zend_error(E_NOTICE, "Trying to get property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); - goto fetch_obj_r_exit; } else { retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); @@ -53045,7 +52948,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN } } while (0); -fetch_obj_r_exit: zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -53106,7 +53008,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { @@ -53471,7 +53372,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CONST == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -53668,7 +53568,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_TMP_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -53865,7 +53764,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_VAR == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -54062,7 +53960,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - if (IS_CV == IS_CONST) { zval_ptr_dtor_nogc(value); } else { @@ -55010,7 +54907,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMPVAR_HANDL break; } } - if (Z_OBJ_HT_P(container)->unset_property) { Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); } else { From 758076ab0c6e789b2ae54ae486edf421ca83ab25 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Tue, 24 May 2016 12:42:13 +0200 Subject: [PATCH 145/369] Fix passed zval reassignments (opcache.protect_memory=1) --- Zend/zend_object_handlers.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index a55e54ef4c0a..a7c141479367 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -758,8 +758,13 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v } if ((variable_ptr = zend_hash_find(zobj->properties, Z_STR_P(member))) != NULL) { zend_property_info *prop_info; + zval val; found: if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot))) { + if (!Z_REFCOUNTED_P(value) || Z_REFCOUNT_P(value) > 1) { + ZVAL_COPY_VALUE(&val, value); + value = &val; + } if (!zend_verify_property_type(prop_info, value, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { zend_verify_property_type_error(prop_info, Z_STR_P(member), value); goto exit; @@ -816,7 +821,12 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) { zend_property_info *prop_info; + zval val; if (cache_slot ? UNEXPECTED(prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2)) : UNEXPECTED(prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), NULL))) { + if (!Z_REFCOUNTED_P(value) || Z_REFCOUNT_P(value) > 1) { + ZVAL_COPY_VALUE(&val, value); + value = &val; + } if (!zend_verify_property_type(prop_info, value, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { zend_verify_property_type_error(prop_info, Z_STR_P(member), value); goto exit; From e5f9ada308a1c2c75bf0a2487740b4d945b42e07 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Tue, 24 May 2016 13:10:00 +0200 Subject: [PATCH 146/369] Respect also immutable values --- .../typed_properties_027.phpt | 2 +- .../typed_properties_041.phpt | 23 +++++++++++++++++++ Zend/zend_object_handlers.c | 4 ++-- 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_041.phpt diff --git a/Zend/tests/type_declarations/typed_properties_027.phpt b/Zend/tests/type_declarations/typed_properties_027.phpt index f8cea4c764c5..03ce2f15893e 100644 --- a/Zend/tests/type_declarations/typed_properties_027.phpt +++ b/Zend/tests/type_declarations/typed_properties_027.phpt @@ -2,8 +2,8 @@ Test typed properties float widen at runtime --FILE-- bar = "10"; + +var_dump($foo->bar); +?> +--EXPECTF-- +int(10) + + + + + + + diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index a7c141479367..ffe2efe44b87 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -761,7 +761,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v zval val; found: if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot))) { - if (!Z_REFCOUNTED_P(value) || Z_REFCOUNT_P(value) > 1) { + if (!Z_REFCOUNTED_P(value) || Z_IMMUTABLE_P(value) || Z_REFCOUNT_P(value) > 1) { ZVAL_COPY_VALUE(&val, value); value = &val; } @@ -823,7 +823,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v zend_property_info *prop_info; zval val; if (cache_slot ? UNEXPECTED(prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2)) : UNEXPECTED(prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), NULL))) { - if (!Z_REFCOUNTED_P(value) || Z_REFCOUNT_P(value) > 1) { + if (!Z_REFCOUNTED_P(value) || Z_IMMUTABLE_P(value) || Z_REFCOUNT_P(value) > 1) { ZVAL_COPY_VALUE(&val, value); value = &val; } From 88def3f76e6258ed21e802a02631ce3cdc2f486d Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 24 May 2016 14:56:10 +0300 Subject: [PATCH 147/369] Added tests --- .../typed_properties_042.phpt | 25 +++++++++++++++++++ .../typed_properties_043.phpt | 24 ++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_042.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_043.phpt 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 000000000000..fdaeab6a6c11 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_042.phpt @@ -0,0 +1,25 @@ +--TEST-- +Proper source duplication on assignment to typed property +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.protect_memory=1 +--FILE-- +bar = "5"; + var_dump($foo->bar); +} +?> +--EXPECT-- +int(5) +int(5) +int(5) +int(5) +int(5) \ No newline at end of file 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 000000000000..ef07d1aef353 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_043.phpt @@ -0,0 +1,24 @@ +--TEST-- +Proper source duplication on assignment to typed property +--INI-- +opcache.enable=0 +opcache.enable_cli=0 +--FILE-- +bar = "5"; + var_dump($foo->bar); +} +?> +--EXPECT-- +int(5) +int(5) +int(5) +int(5) +int(5) \ No newline at end of file From 4b28b0db4bbc5296f278c7588e88acd313c083b3 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 24 May 2016 15:16:25 +0300 Subject: [PATCH 148/369] Added test (error message should be the same independently of called function) --- .../typed_properties_044.phpt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_044.phpt 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 000000000000..be64f744220c --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_044.phpt @@ -0,0 +1,27 @@ +--TEST-- +Proper source duplication on assignment to typed property +--FILE-- +bar); +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; +} +try { + $f($foo->bar); +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; +} +--EXPECT-- +Typed property Foo::$bar must not be referenced +Typed property Foo::$bar must not be referenced From 2ce08cab29b1f48ddbad9f46587a8640022d96eb Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 24 May 2016 15:49:45 +0300 Subject: [PATCH 149/369] Fixed Zend/tests/type_declarations/typed_properties_044.phpt (error message should be the same independently of called function) --- .../typed_properties_010.phpt | 2 +- .../typed_properties_044.phpt | 2 +- Zend/zend_execute.c | 57 +-- Zend/zend_vm_def.h | 35 +- Zend/zend_vm_execute.h | 369 ++++++------------ 5 files changed, 165 insertions(+), 300 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_010.phpt b/Zend/tests/type_declarations/typed_properties_010.phpt index b13d78263728..3ef8eceb5f15 100644 --- a/Zend/tests/type_declarations/typed_properties_010.phpt +++ b/Zend/tests/type_declarations/typed_properties_010.phpt @@ -14,7 +14,7 @@ $foo = new Foo(); $cb($foo->bar); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Foo::$bar must not be passed by reference in %s:11 +Fatal error: Uncaught TypeError: Typed property Foo::$bar must not be referenced in %s:11 Stack trace: #0 {main} thrown in %s on line 11 diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt index be64f744220c..3dc96e25166c 100644 --- a/Zend/tests/type_declarations/typed_properties_044.phpt +++ b/Zend/tests/type_declarations/typed_properties_044.phpt @@ -1,5 +1,5 @@ --TEST-- -Proper source duplication on assignment to typed property +Error message should be the same independently of called function --FILE-- opcode) { - case ZEND_NOP: - case ZEND_TICKS: - case ZEND_EXT_STMT: - case ZEND_FETCH_DIM_W: - case ZEND_FETCH_W: - case ZEND_FETCH_OBJ_W: { - next++; - } goto _zend_vm_is_fetching_reference; - } - - switch (next->opcode) { - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_ADD_ARRAY_ELEMENT: - case ZEND_YIELD: { - return 1; - } break; + while (1) { + switch (next->opcode) { + case ZEND_NOP: + case ZEND_TICKS: + case ZEND_EXT_STMT: + case ZEND_FETCH_DIM_W: + case ZEND_FETCH_W: + case ZEND_FETCH_OBJ_W: + next++; + break; + case ZEND_SEND_REF: + case ZEND_RETURN_BY_REF: + case ZEND_ASSIGN_REF: + case ZEND_INIT_ARRAY: + case ZEND_ADD_ARRAY_ELEMENT: + case ZEND_YIELD: + return 1; + default: + return 0; + } } +} + +static zend_always_inline zend_bool zend_is_referenced_typed_property(zval *container, zval *property, void **cache_slot, const zend_op *opline, int check_opline) +{ + zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, cache_slot); + if (UNEXPECTED(prop_info) + && (!check_opline || UNEXPECTED(zend_vm_is_fetching_reference(opline)))) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + return 1; + } return 0; } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index f98a8478dbd4..97c36bb12b7b 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1953,7 +1953,6 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) zend_free_op free_op1, free_op2; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = GET_OP2_ZVAL_PTR(BP_VAR_R); @@ -1967,14 +1966,10 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + FREE_OP2(); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); } FREE_OP2(); @@ -1991,7 +1986,6 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) zend_free_op free_op1, free_op2; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = GET_OP2_ZVAL_PTR(BP_VAR_R); @@ -2004,14 +1998,10 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) } zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + FREE_OP2(); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); } FREE_OP2(); @@ -2104,7 +2094,6 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST /* Behave like FETCH_OBJ_W */ zend_free_op free_op1, free_op2; zval *property; - zend_property_info *prop_info; SAVE_OPLINE(); property = GET_OP2_ZVAL_PTR(BP_VAR_R); @@ -2124,11 +2113,9 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { + FREE_OP2(); + FREE_OP1_VAR_PTR(); HANDLE_EXCEPTION(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 76ad23d7abcd..73c7c69763b0 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5079,7 +5079,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; - zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -5099,11 +5098,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { + + HANDLE_EXCEPTION(); } @@ -8908,7 +8905,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -8928,11 +8924,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { + + HANDLE_EXCEPTION(); } @@ -10825,7 +10819,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ /* Behave like FETCH_OBJ_W */ zend_free_op free_op1, free_op2; zval *property; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -10845,11 +10838,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); } @@ -13240,7 +13231,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; - zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -13260,11 +13250,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { + + HANDLE_EXCEPTION(); } @@ -14468,7 +14456,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -14488,11 +14475,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { + + HANDLE_EXCEPTION(); } @@ -15000,7 +14985,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM /* Behave like FETCH_OBJ_W */ zend_free_op free_op1, free_op2; zval *property; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -15020,11 +15004,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); } @@ -18271,7 +18253,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -18285,14 +18266,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); } if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -18308,7 +18285,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -18321,14 +18297,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); } if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -18347,7 +18319,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; - zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -18367,11 +18338,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } @@ -23420,7 +23389,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -23434,14 +23402,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); } if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -23457,7 +23421,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -23470,14 +23433,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); } if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -23496,7 +23455,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -23516,11 +23474,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } @@ -26673,7 +26629,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA zend_free_op free_op1, free_op2; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -26687,14 +26642,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); } zval_ptr_dtor_nogc(free_op2); @@ -26711,7 +26662,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H zend_free_op free_op1, free_op2; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -26724,14 +26674,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); } zval_ptr_dtor_nogc(free_op2); @@ -26751,7 +26697,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM /* Behave like FETCH_OBJ_W */ zend_free_op free_op1, free_op2; zval *property; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -26771,11 +26716,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } @@ -29489,7 +29432,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -29503,14 +29445,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + + + HANDLE_EXCEPTION(); } if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -29526,7 +29464,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -29539,14 +29476,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + + + HANDLE_EXCEPTION(); } if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -29637,7 +29570,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; - zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -29657,11 +29589,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { + + HANDLE_EXCEPTION(); } @@ -33279,7 +33209,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -33293,14 +33222,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + + + HANDLE_EXCEPTION(); } if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -33316,7 +33241,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -33329,14 +33253,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + + + HANDLE_EXCEPTION(); } if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -33427,7 +33347,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -33447,11 +33366,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { + + HANDLE_EXCEPTION(); } @@ -35956,7 +35873,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR zend_free_op free_op1, free_op2; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -35970,14 +35886,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); } zval_ptr_dtor_nogc(free_op2); @@ -35994,7 +35906,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA zend_free_op free_op1, free_op2; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -36007,14 +35918,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); } zval_ptr_dtor_nogc(free_op2); @@ -36107,7 +36014,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED /* Behave like FETCH_OBJ_W */ zend_free_op free_op1, free_op2; zval *property; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -36127,11 +36033,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); } @@ -41437,7 +41341,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -41451,14 +41354,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + + + HANDLE_EXCEPTION(); } if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -41474,7 +41373,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -41487,14 +41385,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + + + HANDLE_EXCEPTION(); } if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -41585,7 +41479,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; - zend_property_info *prop_info; SAVE_OPLINE(); property = EX_CONSTANT(opline->op2); @@ -41605,11 +41498,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { + + HANDLE_EXCEPTION(); } @@ -48633,7 +48524,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -48647,14 +48537,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + + + HANDLE_EXCEPTION(); } if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -48670,7 +48556,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE zend_free_op free_op1; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -48683,14 +48568,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + + + HANDLE_EXCEPTION(); } if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -48781,7 +48662,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ /* Behave like FETCH_OBJ_W */ zend_free_op free_op1; zval *property; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -48801,11 +48681,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { + + HANDLE_EXCEPTION(); } @@ -52959,7 +52837,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN zend_free_op free_op1, free_op2; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -52973,14 +52850,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); } zval_ptr_dtor_nogc(free_op2); @@ -52997,7 +52870,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA zend_free_op free_op1, free_op2; zval *property; zval *container; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -53010,14 +52882,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - if (zend_vm_is_fetching_reference(opline)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); } zval_ptr_dtor_nogc(free_op2); @@ -53110,7 +52978,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP /* Behave like FETCH_OBJ_W */ zend_free_op free_op1, free_op2; zval *property; - zend_property_info *prop_info; SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -53130,11 +52997,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)))) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be passed by reference", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); + if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); } From 4705b9ff00f62b2da924d06470eddffd3b9aa588 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 24 May 2016 15:59:48 +0300 Subject: [PATCH 150/369] Fixed memory leaks --- .../typed_properties_045.phpt | 15 +++++++ Zend/zend_vm_def.h | 10 +++++ Zend/zend_vm_execute.h | 40 +++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_045.phpt 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 000000000000..6218564bf88b --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_045.phpt @@ -0,0 +1,15 @@ +--TEST-- +foreach() leaks on object with typed properties +--FILE-- +getMessage() . "\n"; +} +--EXPECT-- +Typed properties exist in Foo: foreach by reference is disallowed diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 97c36bb12b7b..1992047d2069 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -5904,6 +5904,11 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + if (OP1_TYPE == IS_VAR) { + FREE_OP1_VAR_PTR(); + } else { + FREE_OP1(); + } HANDLE_EXCEPTION(); } @@ -5951,6 +5956,11 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + if (OP1_TYPE == IS_VAR) { + FREE_OP1_VAR_PTR(); + } else { + FREE_OP1(); + } HANDLE_EXCEPTION(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 73c7c69763b0..56e8166e986b 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3588,6 +3588,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + if (IS_CONST == IS_VAR) { + + } else { + + } HANDLE_EXCEPTION(); } @@ -3634,6 +3639,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + if (IS_CONST == IS_VAR) { + + } else { + + } HANDLE_EXCEPTION(); } @@ -12702,6 +12712,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + if (IS_TMP_VAR == IS_VAR) { + + } else { + zval_ptr_dtor_nogc(free_op1); + } HANDLE_EXCEPTION(); } @@ -12748,6 +12763,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + if (IS_TMP_VAR == IS_VAR) { + + } else { + zval_ptr_dtor_nogc(free_op1); + } HANDLE_EXCEPTION(); } @@ -16240,6 +16260,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + if (IS_VAR == IS_VAR) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + } else { + zval_ptr_dtor_nogc(free_op1); + } HANDLE_EXCEPTION(); } @@ -16287,6 +16312,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + if (IS_VAR == IS_VAR) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + } else { + zval_ptr_dtor_nogc(free_op1); + } HANDLE_EXCEPTION(); } @@ -38842,6 +38872,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + if (IS_CV == IS_VAR) { + + } else { + + } HANDLE_EXCEPTION(); } @@ -38888,6 +38923,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); + if (IS_CV == IS_VAR) { + + } else { + + } HANDLE_EXCEPTION(); } From 62b6befe5325e408a252d9b948f35c1324901902 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 24 May 2016 16:14:19 +0300 Subject: [PATCH 151/369] Avoid type check for dynamic properties --- Zend/zend_vm_def.h | 7 +- Zend/zend_vm_execute.h | 252 +++++++++++++++++++++++------------------ 2 files changed, 148 insertions(+), 111 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 1992047d2069..7f61c530cf7b 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2242,9 +2242,8 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -ZEND_VM_C_LABEL(fast_assign_obj): - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -2255,6 +2254,8 @@ ZEND_VM_C_LABEL(fast_assign_obj): CACHE_PTR_EX(cache_slot + 2, NULL); } } + +ZEND_VM_C_LABEL(fast_assign_obj): value = zend_assign_to_variable(property, value, OP_DATA_TYPE); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 56e8166e986b..d28972d61a2a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18483,9 +18483,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -18496,6 +18495,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -18679,9 +18680,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -18692,6 +18692,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -18875,9 +18877,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -18888,6 +18889,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -19071,9 +19074,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -19084,6 +19086,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -23619,9 +23623,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -23632,6 +23635,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -23815,9 +23820,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -23828,6 +23832,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -24011,9 +24017,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -24024,6 +24029,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -24207,9 +24214,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -24220,6 +24226,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -26862,9 +26870,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -26875,6 +26882,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -27058,9 +27067,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -27071,6 +27079,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -27254,9 +27264,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -27267,6 +27276,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -27450,9 +27461,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -27463,6 +27473,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -29734,9 +29746,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -29747,6 +29758,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -29930,9 +29943,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -29943,6 +29955,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -30126,9 +30140,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -30139,6 +30152,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -30322,9 +30337,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -30335,6 +30349,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -33511,9 +33527,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -33524,6 +33539,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -33707,9 +33724,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -33720,6 +33736,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -33903,9 +33921,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -33916,6 +33933,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -34099,9 +34118,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -34112,6 +34130,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -36179,9 +36199,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -36192,6 +36211,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -36375,9 +36396,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -36388,6 +36408,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -36571,9 +36593,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -36584,6 +36605,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -36767,9 +36790,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -36780,6 +36802,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -41666,9 +41690,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -41679,6 +41702,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -41862,9 +41887,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -41875,6 +41899,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -42058,9 +42084,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -42071,6 +42096,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -42254,9 +42281,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -42267,6 +42293,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -48849,9 +48877,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -48862,6 +48889,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -49045,9 +49074,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -49058,6 +49086,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -49241,9 +49271,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -49254,6 +49283,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -49437,9 +49468,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -49450,6 +49480,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -53166,9 +53198,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -53179,6 +53210,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CONST); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -53362,9 +53395,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -53375,6 +53407,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_TMP_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -53558,9 +53592,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -53571,6 +53604,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_VAR); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -53754,9 +53789,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { - zend_property_info *prop_info; -fast_assign_obj: - prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + if (UNEXPECTED(prop_info != NULL)) { if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -53767,6 +53801,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D CACHE_PTR_EX(cache_slot + 2, NULL); } } + +fast_assign_obj: value = zend_assign_to_variable(property, value, IS_CV); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); From d27efdb780e81c731592460f0992d3b9ec5cf576 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 24 May 2016 16:21:01 +0300 Subject: [PATCH 152/369] Removed "safety" code for non standard zend objects. If non-standard objects implement typed properties, they should care about type compatibility checks their seves. --- Zend/zend_vm_def.h | 12 -- Zend/zend_vm_execute.h | 432 ----------------------------------------- 2 files changed, 444 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7f61c530cf7b..c4cda82fa8ca 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2337,18 +2337,6 @@ ZEND_VM_C_LABEL(fast_assign_obj): ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index d28972d61a2a..9d08dcaf4976 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18578,18 +18578,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -18775,18 +18763,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -18972,18 +18948,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -19169,18 +19133,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -23718,18 +23670,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -23915,18 +23855,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -24112,18 +24040,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -24309,18 +24225,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -26965,18 +26869,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -27162,18 +27054,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -27359,18 +27239,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -27556,18 +27424,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -29841,18 +29697,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -30038,18 +29882,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -30235,18 +30067,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -30432,18 +30252,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -33622,18 +33430,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -33819,18 +33615,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -34016,18 +33800,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -34213,18 +33985,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -36294,18 +36054,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -36491,18 +36239,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -36688,18 +36424,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -36885,18 +36609,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -41785,18 +41497,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -41982,18 +41682,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -42179,18 +41867,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -42376,18 +42052,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -48972,18 +48636,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -49169,18 +48821,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -49366,18 +49006,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -49563,18 +49191,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -53293,18 +52909,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -53490,18 +53094,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -53687,18 +53279,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { @@ -53884,18 +53464,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - /* safety for non standard zend objects */ - if (UNEXPECTED(Z_OBJ_HT_P(object)->write_property != zend_std_write_property && ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, property_name, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); - - if (prop_info) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - HANDLE_EXCEPTION(); - } - } - } - Z_OBJ_HT_P(object)->write_property(object, property_name, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { From 68bb52e1bed8116c1ac88237bcaf482d4f9a2135 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 24 May 2016 16:43:12 +0300 Subject: [PATCH 153/369] Fixed memory leaks --- .../typed_properties_046.phpt | 29 +++ Zend/zend_object_handlers.c | 1 + Zend/zend_vm_def.h | 5 +- Zend/zend_vm_execute.h | 180 ++++++++++++++---- 4 files changed, 178 insertions(+), 37 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_046.phpt 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 000000000000..8c160a98e75b --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_046.phpt @@ -0,0 +1,29 @@ +--TEST-- +Memory leaks on wrong assignment to typed roperty +--FILE-- +{bar()} = str_repeat("a", 3); + } catch (Throwable $e) { + echo $e->getMessage() . "\n"; + } +} +--EXPECT-- +Typed property Foo::$bbb must be integer, string used +Typed property Foo::$bbb must be integer, string used +Typed property Foo::$bbb must be integer, string used +Typed property Foo::$bbb must be integer, string used +Typed property Foo::$bbb must be integer, string used diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index ffe2efe44b87..77b68d0b2320 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -829,6 +829,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v } if (!zend_verify_property_type(prop_info, value, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { zend_verify_property_type_error(prop_info, Z_STR_P(member), value); + zval_ptr_dtor(value); goto exit; } } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index c4cda82fa8ca..537d307fe8d2 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2245,8 +2245,11 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + FREE_OP_DATA(); + FREE_OP2(); + FREE_OP1_VAR_PTR(); HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 9d08dcaf4976..66cf46cb3ef2 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18486,8 +18486,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -18671,8 +18674,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -18856,8 +18862,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -19041,8 +19050,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -23578,8 +23590,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -23763,8 +23778,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -23948,8 +23966,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -24133,8 +24154,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -26777,8 +26801,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -26962,8 +26989,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -27147,8 +27177,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -27332,8 +27365,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -29605,8 +29641,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -29790,8 +29829,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -29975,8 +30017,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -30160,8 +30205,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -33338,8 +33386,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -33523,8 +33574,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -33708,8 +33762,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -33893,8 +33950,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -35962,8 +36022,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -36147,8 +36210,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -36332,8 +36398,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -36517,8 +36586,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -41405,8 +41477,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -41590,8 +41665,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -41775,8 +41853,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -41960,8 +42041,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -48544,8 +48628,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -48729,8 +48816,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -48914,8 +49004,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -49099,8 +49192,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -52817,8 +52913,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -53002,8 +53101,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -53187,8 +53289,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ @@ -53372,8 +53477,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ From a1e3ea301694caa26a1bb46d01e3842790796bc1 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 24 May 2016 17:16:29 +0300 Subject: [PATCH 154/369] Fixed test (NULL is no compatible with "int" and should produce a error) --- Zend/tests/type_declarations/typed_properties_009.phpt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Zend/tests/type_declarations/typed_properties_009.phpt b/Zend/tests/type_declarations/typed_properties_009.phpt index c4c34dc81062..83ccfcf515e4 100644 --- a/Zend/tests/type_declarations/typed_properties_009.phpt +++ b/Zend/tests/type_declarations/typed_properties_009.phpt @@ -7,7 +7,8 @@ class Foo { public function __get($name) { var_dump($name); - /* implicit return null, weakly cast to int(0) */ + /* return value has to be compatible with int */ + return 0; } } From 4aae93828eb2533f64ec742889e4a0062f000723 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 24 May 2016 17:17:22 +0300 Subject: [PATCH 155/369] Get rid of zend_verify_scalar_property_type(), use common zend_verify_scalar_property_type() instead. --- Zend/zend_execute.c | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index ac766253740a..857937df18dd 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -812,24 +812,6 @@ static int zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, zv return 1; } -static inline zend_bool zend_verify_scalar_property_type(zend_uchar type, zval *property, zend_bool strict) { - if (EXPECTED(!strict)) { - if (UNEXPECTED(!ZEND_SAME_FAKE_TYPE(type, Z_TYPE_P(property)))) { - return zend_verify_weak_scalar_type_hint(type, property); - } - return 1; - } - - if (UNEXPECTED(type == IS_DOUBLE && Z_TYPE_P(property) == IS_LONG)) { - double dest = (double) Z_LVAL_P(property); - zval_ptr_dtor(property); - ZVAL_DOUBLE(property, dest); - return 1; - } - - return ZEND_SAME_FAKE_TYPE(type, Z_TYPE_P(property)); -} - ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property) { zend_string *resolved = zend_resolve_property_type(info->type_name, info->ce); @@ -895,7 +877,7 @@ zend_bool zend_verify_property_type(zend_property_info *info, zval *property, ze } default: - return zend_verify_scalar_property_type(info->type, property, strict); + return zend_verify_scalar_type_hint(info->type, property, strict); } } From 59b8a8543d2791b128c5213d990e5379049e6c03 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 24 May 2016 17:46:36 +0300 Subject: [PATCH 156/369] Optimized zend_verify_property_type() --- Zend/zend_execute.c | 54 +++++++++++++++---------------- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 72 +++++++++++++++++++++--------------------- 3 files changed, 63 insertions(+), 65 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 857937df18dd..334399c2629a 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -812,7 +812,8 @@ static int zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, zv return 1; } -ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property) { +ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property) +{ zend_string *resolved = zend_resolve_property_type(info->type_name, info->ce); /* 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) */ @@ -841,46 +842,43 @@ ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_i } } -zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) { - if (EXPECTED(ZEND_SAME_FAKE_TYPE(info->type, Z_TYPE_P(property)) && Z_TYPE_P(property) != IS_OBJECT)) { - return 1; - } - - switch (info->type) { - case IS_OBJECT: { +static zend_always_inline zend_bool i_zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) +{ + if (EXPECTED(info->type == Z_TYPE_P(property))) { + if (info->type_name) { zend_string *resolved = zend_resolve_property_type(info->type_name, info->ce); if (!info->type_ce) { info->type_ce = zend_lookup_class(resolved); + if (!info->type_ce) { + return 0; + } } - if (!info->type_ce || Z_TYPE_P(property) != IS_OBJECT || !instanceof_function(Z_OBJCE_P(property), info->type_ce)) { + if (!instanceof_function(Z_OBJCE_P(property), info->type_ce)) { return 0; } - - return 1; } - - case IS_CALLABLE: - switch (Z_TYPE_P(property)) { - case IS_OBJECT: - if (instanceof_function(zend_ce_closure, Z_OBJCE_P(property))) { - return 1; - } - - case IS_STRING: - case IS_ARRAY: - return zend_is_callable(property, IS_CALLABLE_CHECK_SILENT, NULL); - - default: - return 0; + return 1; + } else if (EXPECTED(info->type == IS_CALLABLE)) { + if (Z_TYPE_P(property) == IS_OBJECT) { + return instanceof_function(zend_ce_closure, Z_OBJCE_P(property)); + } else { + return zend_is_callable(property, IS_CALLABLE_CHECK_SILENT, NULL); } - - default: - return zend_verify_scalar_type_hint(info->type, property, strict); + } else if (info->type == _IS_BOOL && + EXPECTED(Z_TYPE_P(property) == IS_FALSE || Z_TYPE_P(property) == IS_TRUE)) { + return 1; + } else { + return zend_verify_scalar_type_hint(info->type, property, strict); } } +zend_bool 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 int zend_verify_internal_arg_types(zend_function *fbc, zend_execute_data *call) { uint32_t i; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 537d307fe8d2..b06aaeea012e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2245,7 +2245,7 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); FREE_OP_DATA(); FREE_OP2(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 66cf46cb3ef2..144a5fd43fe5 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18486,7 +18486,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -18674,7 +18674,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -18862,7 +18862,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -19050,7 +19050,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -23590,7 +23590,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -23778,7 +23778,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -23966,7 +23966,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -24154,7 +24154,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -26801,7 +26801,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op2); @@ -26989,7 +26989,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -27177,7 +27177,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -27365,7 +27365,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op2); @@ -29641,7 +29641,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -29829,7 +29829,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -30017,7 +30017,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -30205,7 +30205,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -33386,7 +33386,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -33574,7 +33574,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -33762,7 +33762,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -33950,7 +33950,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -36022,7 +36022,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op2); @@ -36210,7 +36210,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -36398,7 +36398,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -36586,7 +36586,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op2); @@ -41477,7 +41477,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -41665,7 +41665,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -41853,7 +41853,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -42041,7 +42041,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -48628,7 +48628,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -48816,7 +48816,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -49004,7 +49004,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -49192,7 +49192,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -52913,7 +52913,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op2); @@ -53101,7 +53101,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -53289,7 +53289,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -53477,7 +53477,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op2); From d46584fef96b151da3f741bface759ee4098a6d4 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 24 May 2016 17:58:54 +0300 Subject: [PATCH 157/369] Avoid type check for dynamic properties --- Zend/zend_object_handlers.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 77b68d0b2320..3d71e3475522 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -747,20 +747,10 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) { variable_ptr = OBJ_PROP(zobj, property_offset); if (Z_TYPE_P(variable_ptr) != IS_UNDEF) { - goto found; - } - } else if (EXPECTED(zobj->properties != NULL)) { - if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) { - if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) { - GC_REFCOUNT(zobj->properties)--; - } - zobj->properties = zend_array_dup(zobj->properties); - } - if ((variable_ptr = zend_hash_find(zobj->properties, Z_STR_P(member))) != NULL) { - zend_property_info *prop_info; + zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot);; zval val; -found: - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot))) { + + if (UNEXPECTED(prop_info)) { if (!Z_REFCOUNTED_P(value) || Z_IMMUTABLE_P(value) || Z_REFCOUNT_P(value) > 1) { ZVAL_COPY_VALUE(&val, value); value = &val; @@ -770,9 +760,20 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v goto exit; } } +found: zend_assign_to_variable(variable_ptr, value, IS_CV); goto exit; } + } else if (EXPECTED(zobj->properties != NULL)) { + if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) { + if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) { + GC_REFCOUNT(zobj->properties)--; + } + zobj->properties = zend_array_dup(zobj->properties); + } + if ((variable_ptr = zend_hash_find(zobj->properties, Z_STR_P(member))) != NULL) { + goto found; + } } } else if (UNEXPECTED(EG(exception))) { goto exit; From ff19dec4ea0fc80b5ce394f11b8be4fd5953b5cf Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 24 May 2016 21:36:52 +0300 Subject: [PATCH 158/369] Added support for nullable typed properties --- .../typed_properties_047.phpt | 60 +++++++++++++++++++ .../typed_properties_048.phpt | 60 +++++++++++++++++++ Zend/zend_API.c | 5 +- Zend/zend_API.h | 2 +- Zend/zend_compile.c | 11 +++- Zend/zend_compile.h | 1 + Zend/zend_execute.c | 2 + Zend/zend_inheritance.c | 18 ++++-- ext/standard/var.c | 6 +- 9 files changed, 152 insertions(+), 13 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_047.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_048.phpt 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 000000000000..dc592769fa12 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_047.phpt @@ -0,0 +1,60 @@ +--TEST-- +Nullable typed property +--FILE-- +foo); +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + $x->foo = 5; +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + var_dump($x->foo); +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + $x->foo = null; +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + var_dump($x->foo); +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + unset($x->foo); +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +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 (0) { + ["foo"]=> + uninitialized(?integer) +} +Typed property Foo::$foo must not be accessed before initialization +int(5) +NULL +Typed property Foo::$foo must not be accessed before initialization +Typed property Foo::$foo must be integer, 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 000000000000..b0a7517e86ce --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_048.phpt @@ -0,0 +1,60 @@ +--TEST-- +Nullable typed property +--FILE-- +foo); +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + $x->foo = 5; +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + var_dump($x->foo); +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + $x->foo = null; +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + var_dump($x->foo); +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + unset($x->foo); +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +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 integer, string used diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 43cfd4b94c91..d992b953b72c 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3606,7 +3606,7 @@ ZEND_API const char *zend_get_module_version(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_uchar optional_type, zend_string *optional_type_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_uchar optional_type, zend_string *optional_type_name, zend_bool allow_null) /* {{{ */ { zend_property_info *property_info, *property_info_ptr; @@ -3693,6 +3693,7 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name property_info->doc_comment = doc_comment; property_info->ce = ce; property_info->type = optional_type; + property_info->allow_null = allow_null; property_info->type_name = optional_type_name ? zend_new_interned_string(optional_type_name) : NULL; property_info->type_ce = NULL; @@ -3705,7 +3706,7 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name 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, NULL); + return zend_declare_typed_property(ce, name, property, access_type, doc_comment, 0, NULL, 0); } /* }}} */ diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 6953d192554e..805dd89cc715 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -314,7 +314,7 @@ ZEND_API zend_bool zend_make_callable(zval *callable, zend_string **callable_nam 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_uchar type, zend_string *type_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_uchar type, zend_string *type_name, zend_bool allow_null); 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); diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 210166847894..446af602d6ea 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5500,6 +5500,7 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ zend_string *doc_comment = NULL; zval value_zv; zend_uchar optional_type = 0; + zend_bool allow_null = 0; zend_string *optional_type_name = NULL; if (type_ast) { @@ -5516,6 +5517,10 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ zend_string *class_name = zend_ast_get_str(type_ast); zend_uchar type = zend_lookup_builtin_type_by_name(class_name); + if (type_ast->attr & ZEND_TYPE_NULLABLE) { + allow_null = 1; + type_ast->attr &= ~ZEND_TYPE_NULLABLE; + } if (type != 0) { if (type_ast->attr != ZEND_NAME_NOT_FQ) { zend_error_noreturn(E_COMPILE_ERROR, @@ -5568,7 +5573,9 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ zend_const_expr_to_zval(&value_zv, value_ast); if (optional_type && !Z_CONSTANT(value_zv)) { - if (optional_type == IS_ARRAY) { + if (allow_null && Z_TYPE(value_zv) == IS_NULL) { + /* pass */ + } else if (optional_type == IS_ARRAY) { if (Z_TYPE(value_zv) != IS_ARRAY) { zend_error_noreturn(E_COMPILE_ERROR, "Default value for properties with array type can only be an array"); @@ -5594,7 +5601,7 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ name = zend_new_interned_string_safe(name); if (optional_type) { - zend_declare_typed_property(ce, name, &value_zv, flags, doc_comment, optional_type, optional_type_name); + zend_declare_typed_property(ce, name, &value_zv, flags, doc_comment, optional_type, optional_type_name, allow_null); } else { zend_declare_property_ex(ce, name, &value_zv, flags, doc_comment); } diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index e08f589508d7..2be03716e318 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -298,6 +298,7 @@ typedef struct _zend_property_info { zend_string *doc_comment; zend_class_entry *ce; zend_uchar type; + zend_bool allow_null; zend_string *type_name; zend_class_entry *type_ce; } zend_property_info; diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 334399c2629a..b2a7ad614ab0 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -860,6 +860,8 @@ static zend_always_inline zend_bool i_zend_verify_property_type(zend_property_in } } return 1; + } else if (info->allow_null && Z_TYPE_P(property) == IS_NULL) { + return 1; } else if (EXPECTED(info->type == IS_CALLABLE)) { if (Z_TYPE_P(property) == IS_OBJECT) { return instanceof_function(zend_ce_closure, Z_OBJCE_P(property)); diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index d14d190b83e5..5ebf38b73fe8 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -711,20 +711,24 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke if (UNEXPECTED(parent_info->type && !(parent_info->flags & ZEND_ACC_PRIVATE))) { if (parent_info->type == IS_OBJECT) { if (child_info->type != IS_OBJECT || + child_info->allow_null != parent_info->allow_null || !zend_string_equals_ci(zend_resolve_property_type(parent_info->type_name, parent_info->ce), zend_resolve_property_type(child_info->type_name, child_info->ce))) { zend_error_noreturn(E_COMPILE_ERROR, - "Type of %s::$%s must be %s (as in class %s)", + "Type of %s::$%s must be %s%s (as in class %s)", ZSTR_VAL(ce->name), ZSTR_VAL(key), + parent_info->allow_null ? "?" : "", ZSTR_VAL(zend_resolve_property_type(parent_info->type_name, parent_info->ce)), ZSTR_VAL(ce->parent->name)); } - } else if (parent_info->type != child_info->type) { + } else if (parent_info->type != child_info->type || + parent_info->allow_null != child_info->allow_null) { zend_error_noreturn(E_COMPILE_ERROR, - "Type of %s::$%s must be %s (as in class %s)", + "Type of %s::$%s must be %s%s (as in class %s)", ZSTR_VAL(ce->name), ZSTR_VAL(key), + parent_info->allow_null ? "?" : "", zend_get_type_by_const(parent_info->type), ZSTR_VAL(ce->parent->name)); } @@ -740,16 +744,18 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke if (UNEXPECTED(parent_info->type && !(parent_info->flags & ZEND_ACC_PRIVATE))) { if (parent_info->type == IS_OBJECT) { zend_error_noreturn(E_COMPILE_ERROR, - "Type of %s::$%s must be %s (as in class %s)", + "Type of %s::$%s must be %s%s (as in class %s)", ZSTR_VAL(ce->name), ZSTR_VAL(key), + parent_info->allow_null ? "?" : "", ZSTR_VAL(zend_resolve_property_type(parent_info->type_name, parent_info->ce)), ZSTR_VAL(ce->parent->name)); } else { zend_error_noreturn(E_COMPILE_ERROR, - "Type of %s::$%s must be %s (as in class %s)", + "Type of %s::$%s must be %s%s (as in class %s)", ZSTR_VAL(ce->name), ZSTR_VAL(key), + parent_info->allow_null ? "?" : "", zend_get_type_by_const(parent_info->type), ZSTR_VAL(ce->parent->name)); } @@ -1675,7 +1681,7 @@ static void zend_do_traits_property_binding(zend_class_entry *ce) /* {{{ */ if (Z_TYPE_P(prop_value) == IS_NULL) { ZVAL_UNDEF(prop_value); } - zend_declare_typed_property(ce, prop_name, prop_value, flags, doc_comment, property_info->type, property_info->type_name); + zend_declare_typed_property(ce, prop_name, prop_value, flags, doc_comment, property_info->type, property_info->type_name, property_info->allow_null); } else { zend_declare_property_ex(ce, prop_name, prop_value, flags, doc_comment); } diff --git a/ext/standard/var.c b/ext/standard/var.c index f5b57862ca10..16e05cd76526 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -74,8 +74,9 @@ static void php_object_property_dump(zend_property_info *prop_info, zval *zv, ze if (Z_TYPE_P(zv) == IS_UNDEF) { if (prop_info->type) { - php_printf("%*cuninitialized(%s)\n", + php_printf("%*cuninitialized(%s%s)\n", level + 1, ' ', + prop_info->allow_null ? "?" : "", (prop_info->type == IS_OBJECT) ? ZSTR_VAL(prop_info->type_name) : zend_get_type_by_const(prop_info->type)); @@ -269,8 +270,9 @@ static void zval_object_property_dump(zend_property_info *prop_info, zval *zv, z } if (prop_info && Z_TYPE_P(zv) == IS_UNDEF) { if (prop_info->type) { - php_printf("%*cuninitialized(%s)\n", + php_printf("%*cuninitialized(%s%s)\n", level + 1, ' ', + prop_info->allow_null ? "?" : "", (prop_info->type == IS_OBJECT) ? ZSTR_VAL(prop_info->type_name) : zend_get_type_by_const(prop_info->type)); From 7d0654eb460a0aac2c5102c6ca035a4aa580eed3 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 24 May 2016 21:43:57 +0300 Subject: [PATCH 159/369] Added test --- .../typed_properties_049.phpt | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_049.phpt 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 000000000000..2e0b068f3bee --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_049.phpt @@ -0,0 +1,52 @@ +--TEST-- +Nullable typed property +--FILE-- +foo); +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + $x->foo = 5; +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + var_dump($x->foo); +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + $x->foo = null; +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + var_dump($x->foo); +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + unset($x->foo); +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + var_dump($x->foo); +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +try { + $x->foo = "ops"; +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +?> +--EXPECTF-- +Fatal error: Default value for properties with integer type can only be integer in %styped_properties_049.php on line 3 From 852606cb664990bf8cc37492151a825bfa2d3afb Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 25 May 2016 00:44:29 +0200 Subject: [PATCH 160/369] Fix further invalid source zval overwrites --- .../typed_properties_050.phpt | 19 + Zend/zend_object_handlers.c | 28 +- Zend/zend_vm_def.h | 15 +- Zend/zend_vm_execute.h | 540 ++++++++++++++++-- 4 files changed, 554 insertions(+), 48 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_050.phpt 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 000000000000..cc3d1358c3df --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_050.phpt @@ -0,0 +1,19 @@ +--TEST-- +Weak casts must not overwrite source variables +--FILE-- +a = $b; +var_dump($o, $b); + +?> +--EXPECT-- +object(A)#1 (1) { + ["a"]=> + int(1) +} +string(1) "1" diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 3d71e3475522..609739c236a2 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -747,18 +747,26 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) { variable_ptr = OBJ_PROP(zobj, property_offset); if (Z_TYPE_P(variable_ptr) != IS_UNDEF) { - zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot);; + zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot); zval val; if (UNEXPECTED(prop_info)) { - if (!Z_REFCOUNTED_P(value) || Z_IMMUTABLE_P(value) || Z_REFCOUNT_P(value) > 1) { - ZVAL_COPY_VALUE(&val, value); - value = &val; - } - if (!zend_verify_property_type(prop_info, value, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { - zend_verify_property_type_error(prop_info, Z_STR_P(member), value); + ZVAL_COPY(&val, value); + if (!zend_verify_property_type(prop_info, &val, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { + zend_verify_property_type_error(prop_info, Z_STR_P(member), &val); goto exit; } + if (UNEXPECTED(Z_TYPE(val) != Z_TYPE_P(value))) { + /* little hack to avoid checking prop_info or inlining zend_assign_to_variable multiple times */ + if (UNEXPECTED(Z_REFCOUNTED(tmp_member))) { + zval_ptr_dtor(&tmp_member); + } + + ZVAL_COPY_VALUE(&tmp_member, &val); + value = &val; + } else if (Z_OPT_REFCOUNTED_P(value)) { + Z_DELREF_P(value); + } } found: zend_assign_to_variable(variable_ptr, value, IS_CV); @@ -824,10 +832,8 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v zend_property_info *prop_info; zval val; if (cache_slot ? UNEXPECTED(prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2)) : UNEXPECTED(prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), NULL))) { - if (!Z_REFCOUNTED_P(value) || Z_IMMUTABLE_P(value) || Z_REFCOUNT_P(value) > 1) { - ZVAL_COPY_VALUE(&val, value); - value = &val; - } + ZVAL_COPY_VALUE(&val, value); + value = &val; if (!zend_verify_property_type(prop_info, value, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { zend_verify_property_type_error(prop_info, Z_STR_P(member), value); zval_ptr_dtor(value); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b06aaeea012e..dfc0da11e063 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2245,15 +2245,28 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (OP_DATA_TYPE & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (OP_DATA_TYPE & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } FREE_OP_DATA(); FREE_OP2(); FREE_OP1_VAR_PTR(); HANDLE_EXCEPTION(); } + if (OP_DATA_TYPE & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (OP_DATA_TYPE == IS_CONST) { + if (OP_DATA_TYPE == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 144a5fd43fe5..6dd548184ecc 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18486,15 +18486,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CONST & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -18674,15 +18687,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -18862,15 +18888,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -19050,15 +19089,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CV & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -23590,15 +23642,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CONST & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -23778,15 +23843,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -23966,15 +24044,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -24154,15 +24245,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CV & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -26801,15 +26905,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CONST & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -26989,15 +27106,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -27177,15 +27307,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -27365,15 +27508,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CV & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -29641,15 +29797,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CONST & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } HANDLE_EXCEPTION(); } + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -29829,15 +29998,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); HANDLE_EXCEPTION(); } + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -30017,15 +30199,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); HANDLE_EXCEPTION(); } + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -30205,15 +30400,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CV & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } HANDLE_EXCEPTION(); } + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -33386,15 +33594,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CONST & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } HANDLE_EXCEPTION(); } + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -33574,15 +33795,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); HANDLE_EXCEPTION(); } + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -33762,15 +33996,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); HANDLE_EXCEPTION(); } + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -33950,15 +34197,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CV & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } HANDLE_EXCEPTION(); } + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -36022,15 +36282,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CONST & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -36210,15 +36483,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -36398,15 +36684,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -36586,15 +36885,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CV & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -41477,15 +41789,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CONST & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } HANDLE_EXCEPTION(); } + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -41665,15 +41990,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); HANDLE_EXCEPTION(); } + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -41853,15 +42191,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); HANDLE_EXCEPTION(); } + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -42041,15 +42392,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CV & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } HANDLE_EXCEPTION(); } + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -48628,15 +48992,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CONST & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } HANDLE_EXCEPTION(); } + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -48816,15 +49193,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); HANDLE_EXCEPTION(); } + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -49004,15 +49394,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); HANDLE_EXCEPTION(); } + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -49192,15 +49595,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CV & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } HANDLE_EXCEPTION(); } + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -52913,15 +53329,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CONST & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } + if (IS_CONST & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -53101,15 +53530,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } + if (IS_TMP_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -53289,15 +53731,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_VAR & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } + if (IS_VAR & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -53477,15 +53932,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { + zval val, *orig; + /* avoid overwriting source (does not matter for TMP/VAR) */ + if (IS_CV & (IS_CONST | IS_CV)) { + orig = value; + ZVAL_COPY(&val, value); + value = &val; + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } + if (IS_CV & (IS_CONST | IS_CV)) { + zval_ptr_dtor_nogc(&val); + } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { CACHE_PTR_EX(cache_slot + 2, NULL); } } From 03861bd484738d43567466cb9ef20185e20dd2c8 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 10:45:30 +0300 Subject: [PATCH 161/369] Reverted incomplete fix --- Zend/zend_object_handlers.c | 24 +- Zend/zend_vm_def.h | 15 +- Zend/zend_vm_execute.h | 540 +++--------------------------------- 3 files changed, 41 insertions(+), 538 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index ec3dac04b466..2b4aa94b0468 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -591,7 +591,7 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ zval tmp_member; zval *retval; uint32_t property_offset; - zend_property_info *prop_info = NULL; + zend_property_info *prop_info; zobj = Z_OBJ_P(object); @@ -734,25 +734,12 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v variable_ptr = OBJ_PROP(zobj, property_offset); if (Z_TYPE_P(variable_ptr) != IS_UNDEF) { zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot); - zval val; if (UNEXPECTED(prop_info)) { - ZVAL_COPY(&val, value); - if (!zend_verify_property_type(prop_info, &val, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { - zend_verify_property_type_error(prop_info, Z_STR_P(member), &val); + if (!zend_verify_property_type(prop_info, value, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { + zend_verify_property_type_error(prop_info, Z_STR_P(member), value); goto exit; } - if (UNEXPECTED(Z_TYPE(val) != Z_TYPE_P(value))) { - /* little hack to avoid checking prop_info or inlining zend_assign_to_variable multiple times */ - if (UNEXPECTED(Z_REFCOUNTED(tmp_member))) { - zval_ptr_dtor(&tmp_member); - } - - ZVAL_COPY_VALUE(&tmp_member, &val); - value = &val; - } else if (Z_OPT_REFCOUNTED_P(value)) { - Z_DELREF_P(value); - } } found: zend_assign_to_variable(variable_ptr, value, IS_CV); @@ -808,13 +795,10 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v Z_ADDREF_P(value); } } - if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) { zend_property_info *prop_info; - zval val; + if (cache_slot ? UNEXPECTED(prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2)) : UNEXPECTED(prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), NULL))) { - ZVAL_COPY_VALUE(&val, value); - value = &val; if (!zend_verify_property_type(prop_info, value, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { zend_verify_property_type_error(prop_info, Z_STR_P(member), value); zval_ptr_dtor(value); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 8ce50e2b5ae9..66f546d627d3 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2245,28 +2245,15 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (OP_DATA_TYPE & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (OP_DATA_TYPE & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } FREE_OP_DATA(); FREE_OP2(); FREE_OP1_VAR_PTR(); HANDLE_EXCEPTION(); } - if (OP_DATA_TYPE & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (OP_DATA_TYPE == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (OP_DATA_TYPE == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 25488461e517..efc5504a4d08 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18463,28 +18463,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CONST & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -18664,28 +18651,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -18865,28 +18839,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -19066,28 +19027,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CV & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -23619,28 +23567,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CONST & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -23820,28 +23755,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -24021,28 +23943,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -24222,28 +24131,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CV & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -26882,28 +26778,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CONST & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -27083,28 +26966,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -27284,28 +27154,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -27485,28 +27342,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CV & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -29774,28 +29618,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CONST & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } HANDLE_EXCEPTION(); } - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -29975,28 +29806,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); HANDLE_EXCEPTION(); } - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -30176,28 +29994,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); HANDLE_EXCEPTION(); } - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -30377,28 +30182,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CV & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } HANDLE_EXCEPTION(); } - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -33571,28 +33363,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CONST & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } HANDLE_EXCEPTION(); } - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -33772,28 +33551,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); HANDLE_EXCEPTION(); } - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -33973,28 +33739,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); HANDLE_EXCEPTION(); } - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -34174,28 +33927,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CV & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } HANDLE_EXCEPTION(); } - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -36259,28 +35999,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CONST & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -36460,28 +36187,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -36661,28 +36375,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -36862,28 +36563,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CV & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -41766,28 +41454,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CONST & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } HANDLE_EXCEPTION(); } - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -41967,28 +41642,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); HANDLE_EXCEPTION(); } - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -42168,28 +41830,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); HANDLE_EXCEPTION(); } - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -42369,28 +42018,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CV & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } HANDLE_EXCEPTION(); } - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -48969,28 +48605,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CONST & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } HANDLE_EXCEPTION(); } - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -49170,28 +48793,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); HANDLE_EXCEPTION(); } - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -49371,28 +48981,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); HANDLE_EXCEPTION(); } - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -49572,28 +49169,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CV & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } HANDLE_EXCEPTION(); } - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -53306,28 +52890,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CONST & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - if (IS_CONST & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CONST == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -53507,28 +53078,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - if (IS_TMP_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_TMP_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -53708,28 +53266,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_VAR & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - if (IS_VAR & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_VAR == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } @@ -53909,28 +53454,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); if (UNEXPECTED(prop_info != NULL)) { - zval val, *orig; - /* avoid overwriting source (does not matter for TMP/VAR) */ - if (IS_CV & (IS_CONST | IS_CV)) { - orig = value; - ZVAL_COPY(&val, value); - value = &val; - } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - if (IS_CV & (IS_CONST | IS_CV)) { - zval_ptr_dtor_nogc(&val); - } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && Z_TYPE(val) == Z_TYPE_P(orig)) { + if (IS_CV == IS_CONST) { CACHE_PTR_EX(cache_slot + 2, NULL); } } From be071cdb6c1d1607ba2380d286fc82e2cdb9295d Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 11:24:32 +0300 Subject: [PATCH 162/369] Fixed test --- Zend/tests/type_declarations/typed_properties_050.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/tests/type_declarations/typed_properties_050.phpt b/Zend/tests/type_declarations/typed_properties_050.phpt index cc3d1358c3df..3fa826083e13 100644 --- a/Zend/tests/type_declarations/typed_properties_050.phpt +++ b/Zend/tests/type_declarations/typed_properties_050.phpt @@ -8,7 +8,7 @@ $a = "$b"; class A { public int $a; } $o = new A; $o->a = $b; -var_dump($o, $b); +var_dump($o, $a); ?> --EXPECT-- From c992fcf593ac1c216692d3fd6853a95360d9316f Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 12:21:28 +0300 Subject: [PATCH 163/369] A better to fix for source zval separation on type conversion caused by weak property type check. --- .../typed_properties_051.phpt | 27 ++ Zend/zend_API.c | 10 +- Zend/zend_execute.c | 55 ++-- Zend/zend_execute.h | 2 +- Zend/zend_object_handlers.c | 15 +- Zend/zend_vm_def.h | 7 +- Zend/zend_vm_execute.h | 252 +++++++++++++----- ext/standard/var_unserializer.c | 46 ++-- ext/standard/var_unserializer.re | 5 +- 9 files changed, 292 insertions(+), 127 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_051.phpt 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 000000000000..1556eabe49ce --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_051.phpt @@ -0,0 +1,27 @@ +--TEST-- +Weak casts must not leak +--FILE-- +a = new B; +var_dump($o->a); +try { + $o->a = new C; +} catch (Throwable $e) { + echo $e->getMessage()."\n"; +} +?> +--EXPECT-- +string(4) "okok" +Typed property A::$a must be string, C used diff --git a/Zend/zend_API.c b/Zend/zend_API.c index d992b953b72c..885b0ffb9cf5 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1195,13 +1195,17 @@ ZEND_API void object_properties_init_ex(zend_object *object, HashTable *properti zval *slot = OBJ_PROP(object, property_info->offset); if (UNEXPECTED(property_info->type)) { - if (UNEXPECTED(!zend_verify_property_type(property_info, prop, 0))) { + zval tmp, *val; + + val = zend_verify_property_type(property_info, prop, &tmp, 0); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(property_info, key, prop); continue; } + ZVAL_COPY_VALUE(slot, val); + } else { + ZVAL_COPY_VALUE(slot, prop); } - - ZVAL_COPY_VALUE(slot, prop); ZVAL_INDIRECT(prop, slot); } } ZEND_HASH_FOREACH_END(); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 6fc3b5f3148b..7590e8680d36 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -705,7 +705,7 @@ static int is_null_constant(zend_class_entry *scope, zval *default_value) return 0; } -static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *arg) +static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *arg, zval *ret) { switch (type_hint) { case _IS_BOOL: { @@ -715,7 +715,7 @@ static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *a return 0; } zval_ptr_dtor(arg); - ZVAL_BOOL(arg, dest); + ZVAL_BOOL(ret, dest); return 1; } case IS_LONG: { @@ -725,7 +725,7 @@ static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *a return 0; } zval_ptr_dtor(arg); - ZVAL_LONG(arg, dest); + ZVAL_LONG(ret, dest); return 1; } case IS_DOUBLE: { @@ -735,14 +735,24 @@ static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *a return 0; } zval_ptr_dtor(arg); - ZVAL_DOUBLE(arg, dest); + ZVAL_DOUBLE(ret, dest); return 1; } case IS_STRING: { zend_string *dest; + if (arg != ret) { + ZVAL_COPY(ret, arg); + /* on success "arg" is converted to IS_STRING */ + if (!zend_parse_arg_str_weak(ret, &dest)) { + zval_ptr_dtor(ret); + return 0; + } + zval_ptr_dtor(arg); + return 1; + } /* on success "arg" is converted to IS_STRING */ - if (!zend_parse_arg_str_weak(arg, &dest)) { + if (!zend_parse_arg_str_weak(ret, &dest)) { return 0; } return 1; @@ -752,7 +762,7 @@ static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *a } } -static zend_bool zend_verify_scalar_type_hint(zend_uchar type_hint, zval *arg, zend_bool strict) +static zend_bool zend_verify_scalar_type_hint(zend_uchar type_hint, zval *arg, zval *ret, zend_bool strict) { if (UNEXPECTED(strict)) { /* SSTH Exception: IS_LONG may be accepted as IS_DOUBLE (converted) */ @@ -763,7 +773,7 @@ static zend_bool zend_verify_scalar_type_hint(zend_uchar type_hint, zval *arg, z /* NULL may be accepted only by nullable hints (this is already checked) */ return 0; } - return zend_verify_weak_scalar_type_hint(type_hint, arg); + return zend_verify_weak_scalar_type_hint(type_hint, arg, ret); } static int zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, zval *arg) @@ -803,7 +813,7 @@ static int zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, zv } else if (cur_arg_info->type_hint == _IS_BOOL && EXPECTED(Z_TYPE_P(arg) == IS_FALSE || Z_TYPE_P(arg) == IS_TRUE)) { /* pass */ - } else if (UNEXPECTED(!zend_verify_scalar_type_hint(cur_arg_info->type_hint, arg, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { + } else if (UNEXPECTED(!zend_verify_scalar_type_hint(cur_arg_info->type_hint, arg, arg, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { zend_verify_arg_error(zf, arg_num, "be of the type ", zend_get_type_by_const(cur_arg_info->type_hint), zend_zval_type_name(arg), ""); return 0; } @@ -842,7 +852,7 @@ ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_i } } -static zend_always_inline zend_bool i_zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) +static zend_always_inline zval* i_zend_verify_property_type(zend_property_info *info, zval *property, zval *tmp, zend_bool strict) { if (EXPECTED(info->type == Z_TYPE_P(property))) { if (info->type_name) { @@ -851,34 +861,37 @@ static zend_always_inline zend_bool i_zend_verify_property_type(zend_property_in if (!info->type_ce) { info->type_ce = zend_lookup_class(resolved); if (!info->type_ce) { - return 0; + return NULL; } } if (!instanceof_function(Z_OBJCE_P(property), info->type_ce)) { - return 0; + return NULL; } } - return 1; + return property; } else if (info->allow_null && Z_TYPE_P(property) == IS_NULL) { - return 1; + return property; } else if (EXPECTED(info->type == IS_CALLABLE)) { if (Z_TYPE_P(property) == IS_OBJECT) { - return instanceof_function(zend_ce_closure, Z_OBJCE_P(property)); + return instanceof_function(zend_ce_closure, Z_OBJCE_P(property)) ? + property : NULL; } else { - return zend_is_callable(property, IS_CALLABLE_CHECK_SILENT, NULL); + return zend_is_callable(property, IS_CALLABLE_CHECK_SILENT, NULL) ? + property : NULL; } } else if (info->type == _IS_BOOL && EXPECTED(Z_TYPE_P(property) == IS_FALSE || Z_TYPE_P(property) == IS_TRUE)) { - return 1; + return property; } else { - return zend_verify_scalar_type_hint(info->type, property, strict); + return zend_verify_scalar_type_hint(info->type, property, tmp, strict) ? + tmp : NULL; } } -zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) +zval* zend_verify_property_type(zend_property_info *info, zval *property, zval *tmp, zend_bool strict) { - return i_zend_verify_property_type(info, property, strict); + return i_zend_verify_property_type(info, property, tmp, strict); } static zend_never_inline int zend_verify_internal_arg_types(zend_function *fbc, zend_execute_data *call) @@ -963,7 +976,7 @@ static zend_always_inline int zend_verify_arg_type(zend_function *zf, uint32_t a } else if (cur_arg_info->type_hint == _IS_BOOL && EXPECTED(Z_TYPE_P(arg) == IS_FALSE || Z_TYPE_P(arg) == IS_TRUE)) { /* pass */ - } else if (UNEXPECTED(!zend_verify_scalar_type_hint(cur_arg_info->type_hint, arg, ZEND_ARG_USES_STRICT_TYPES()))) { + } else if (UNEXPECTED(!zend_verify_scalar_type_hint(cur_arg_info->type_hint, arg, arg, ZEND_ARG_USES_STRICT_TYPES()))) { zend_verify_arg_error(zf, arg_num, "be of the type ", zend_get_type_by_const(cur_arg_info->type_hint), zend_zval_type_name(arg), ""); return 0; } @@ -1180,7 +1193,7 @@ static zend_always_inline void zend_verify_return_type(zend_function *zf, zval * * that bans `return ...;` within a void function. Thus we can skip * this part of the runtime check for non-internal functions. */ - } else if (UNEXPECTED(!zend_verify_scalar_type_hint(ret_info->type_hint, ret, ZEND_RET_USES_STRICT_TYPES()))) { + } else if (UNEXPECTED(!zend_verify_scalar_type_hint(ret_info->type_hint, ret, ret, ZEND_RET_USES_STRICT_TYPES()))) { zend_verify_return_error(zf, "be of the type ", zend_get_type_by_const(ret_info->type_hint), zend_zval_type_name(ret), ""); } } diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index ffd3c936e246..50a1645154fb 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -420,7 +420,7 @@ static zend_always_inline zend_property_info* zend_object_fetch_property_type_in return zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); } -zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict); +zval* zend_verify_property_type(zend_property_info *info, zval *property, zval *tmp, zend_bool strict); ZEND_COLD void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property); END_EXTERN_C() diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 2b4aa94b0468..5daaeae96385 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -677,7 +677,10 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) && (prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot)))) { - if (!UNEXPECTED(zend_verify_property_type(prop_info, retval, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES) != 0))) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, retval, &tmp, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES) != 0); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(member), retval); } } @@ -734,12 +737,15 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v variable_ptr = OBJ_PROP(zobj, property_offset); if (Z_TYPE_P(variable_ptr) != IS_UNDEF) { zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot); + zval tmp, *val; if (UNEXPECTED(prop_info)) { - if (!zend_verify_property_type(prop_info, value, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { + val = zend_verify_property_type(prop_info, value, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(member), value); goto exit; } + value = val; } found: zend_assign_to_variable(variable_ptr, value, IS_CV); @@ -797,13 +803,16 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v } if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) { zend_property_info *prop_info; + zval tmp, *val; if (cache_slot ? UNEXPECTED(prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2)) : UNEXPECTED(prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), NULL))) { - if (!zend_verify_property_type(prop_info, value, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { + val = zend_verify_property_type(prop_info, value, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(member), value); zval_ptr_dtor(value); goto exit; } + value = val; } ZVAL_COPY_VALUE(OBJ_PROP(zobj, property_offset), value); } else { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 66f546d627d3..0182b5b5315e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2243,9 +2243,11 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); FREE_OP_DATA(); FREE_OP2(); @@ -2253,9 +2255,10 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (OP_DATA_TYPE == IS_CONST) { + if (OP_DATA_TYPE == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } ZEND_VM_C_LABEL(fast_assign_obj): diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index efc5504a4d08..fc41a0dcc860 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18461,9 +18461,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -18471,9 +18473,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -18649,9 +18652,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -18659,9 +18664,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -18837,9 +18843,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -18847,9 +18855,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -19025,9 +19034,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -19035,9 +19046,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -23565,9 +23577,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -23575,9 +23589,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -23753,9 +23768,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -23763,9 +23780,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -23941,9 +23959,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -23951,9 +23971,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -24129,9 +24150,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -24139,9 +24162,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -26776,9 +26800,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op2); @@ -26786,9 +26812,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -26964,9 +26991,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -26974,9 +27003,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -27152,9 +27182,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -27162,9 +27194,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -27340,9 +27373,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op2); @@ -27350,9 +27385,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -29616,9 +29652,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -29626,9 +29664,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -29804,9 +29843,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -29814,9 +29855,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -29992,9 +30034,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -30002,9 +30046,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -30180,9 +30225,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -30190,9 +30237,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -33361,9 +33409,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -33371,9 +33421,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -33549,9 +33600,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -33559,9 +33612,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -33737,9 +33791,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -33747,9 +33803,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -33925,9 +33982,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -33935,9 +33994,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -35997,9 +36057,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op2); @@ -36007,9 +36069,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -36185,9 +36248,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -36195,9 +36260,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -36373,9 +36439,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -36383,9 +36451,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -36561,9 +36630,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op2); @@ -36571,9 +36642,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -41452,9 +41524,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -41462,9 +41536,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -41640,9 +41715,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -41650,9 +41727,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -41828,9 +41906,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -41838,9 +41918,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -42016,9 +42097,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -42026,9 +42109,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -48603,9 +48687,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -48613,9 +48699,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -48791,9 +48878,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -48801,9 +48890,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -48979,9 +49069,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); @@ -48989,9 +49081,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -49167,9 +49260,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); @@ -49177,9 +49272,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -52888,9 +52984,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op2); @@ -52898,9 +52996,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST) { + if (IS_CONST == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -53076,9 +53175,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -53086,9 +53187,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST) { + if (IS_TMP_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -53264,9 +53366,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -53274,9 +53378,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST) { + if (IS_VAR == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: @@ -53452,9 +53557,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); + zval tmp, *val; if (UNEXPECTED(prop_info != NULL)) { - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { + val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); zval_ptr_dtor_nogc(free_op2); @@ -53462,9 +53569,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST) { + if (IS_CV == IS_CONST && val == value) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = val; } fast_assign_obj: diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c index a776e8a404a2..7879d977b6ce 100644 --- a/ext/standard/var_unserializer.c +++ b/ext/standard/var_unserializer.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.14.3 */ +/* Generated by re2c 0.13.5 */ #line 1 "ext/standard/var_unserializer.re" /* +----------------------------------------------------------------------+ @@ -304,7 +304,7 @@ static inline size_t parse_uiv(const unsigned char *p) static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, zend_long elements, zend_class_entry *ce) { while (elements-- > 0) { - zval key, *data, d, *old_data; + zval key, *data, d, *old_data, tmp; zend_ulong idx; zend_property_info *info = NULL; @@ -399,7 +399,8 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab } if (UNEXPECTED(info)) { - if (UNEXPECTED(!zend_verify_property_type(info, data, 1))) { + data = zend_verify_property_type(info, data, &tmp, 1); + if (UNEXPECTED(!data)) { zval_dtor(&key); return 0; } @@ -550,7 +551,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) start = cursor; -#line 554 "ext/standard/var_unserializer.c" +#line 555 "ext/standard/var_unserializer.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -610,9 +611,9 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *(YYMARKER = ++YYCURSOR); if (yych == ':') goto yy95; yy3: -#line 920 "ext/standard/var_unserializer.re" +#line 921 "ext/standard/var_unserializer.re" { return 0; } -#line 616 "ext/standard/var_unserializer.c" +#line 617 "ext/standard/var_unserializer.c" yy4: yych = *(YYMARKER = ++YYCURSOR); if (yych == ':') goto yy89; @@ -655,13 +656,13 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) goto yy3; yy14: ++YYCURSOR; -#line 914 "ext/standard/var_unserializer.re" +#line 915 "ext/standard/var_unserializer.re" { /* this is the case where we have less data than planned */ php_error_docref(NULL, E_NOTICE, "Unexpected end of serialized data"); return 0; /* not sure if it should be 0 or 1 here? */ } -#line 665 "ext/standard/var_unserializer.c" +#line 666 "ext/standard/var_unserializer.c" yy16: yych = *++YYCURSOR; goto yy3; @@ -687,12 +688,11 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) if (yybm[0+yych] & 128) { goto yy20; } - if (yych <= '/') goto yy18; - if (yych >= ';') goto yy18; + if (yych != ':') goto yy18; yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 769 "ext/standard/var_unserializer.re" +#line 770 "ext/standard/var_unserializer.re" { size_t len, len2, len3, maxlen; zend_long elements; @@ -862,7 +862,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 762 "ext/standard/var_unserializer.re" +#line 763 "ext/standard/var_unserializer.re" { if (!var_hash) return 0; @@ -890,7 +890,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != '{') goto yy18; ++YYCURSOR; -#line 738 "ext/standard/var_unserializer.re" +#line 739 "ext/standard/var_unserializer.re" { zend_long elements = parse_iv(start + 2); /* use iv() not uiv() in order to check data range */ @@ -935,7 +935,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 704 "ext/standard/var_unserializer.re" +#line 705 "ext/standard/var_unserializer.re" { size_t len, maxlen; zend_string *str; @@ -990,7 +990,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 672 "ext/standard/var_unserializer.re" +#line 673 "ext/standard/var_unserializer.re" { size_t len, maxlen; char *str; @@ -1110,7 +1110,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) } yy63: ++YYCURSOR; -#line 663 "ext/standard/var_unserializer.re" +#line 664 "ext/standard/var_unserializer.re" { #if SIZEOF_ZEND_LONG == 4 use_double: @@ -1178,7 +1178,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != ';') goto yy18; ++YYCURSOR; -#line 647 "ext/standard/var_unserializer.re" +#line 648 "ext/standard/var_unserializer.re" { *p = YYCURSOR; @@ -1221,7 +1221,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) if (yych <= '9') goto yy79; if (yych != ';') goto yy18; ++YYCURSOR; -#line 621 "ext/standard/var_unserializer.re" +#line 622 "ext/standard/var_unserializer.re" { #if SIZEOF_ZEND_LONG == 4 int digits = YYCURSOR - start - 3; @@ -1255,7 +1255,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != ';') goto yy18; ++YYCURSOR; -#line 615 "ext/standard/var_unserializer.re" +#line 616 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_BOOL(rval, parse_iv(start + 2)); @@ -1264,7 +1264,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) #line 1265 "ext/standard/var_unserializer.c" yy87: ++YYCURSOR; -#line 609 "ext/standard/var_unserializer.re" +#line 610 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_NULL(rval); @@ -1293,7 +1293,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) if (yych <= '9') goto yy91; if (yych != ';') goto yy18; ++YYCURSOR; -#line 584 "ext/standard/var_unserializer.re" +#line 585 "ext/standard/var_unserializer.re" { zend_long id; @@ -1341,7 +1341,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) if (yych <= '9') goto yy97; if (yych != ';') goto yy18; ++YYCURSOR; -#line 558 "ext/standard/var_unserializer.re" +#line 559 "ext/standard/var_unserializer.re" { zend_long id; @@ -1369,7 +1369,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) } #line 1371 "ext/standard/var_unserializer.c" } -#line 922 "ext/standard/var_unserializer.re" +#line 923 "ext/standard/var_unserializer.re" return 0; diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index bfc8a359ba6b..8cd6b40a1bf5 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -308,7 +308,7 @@ static inline size_t parse_uiv(const unsigned char *p) static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, zend_long elements, zend_class_entry *ce) { while (elements-- > 0) { - zval key, *data, d, *old_data; + zval key, *data, d, *old_data, tmp; zend_ulong idx; zend_property_info *info = NULL; @@ -403,7 +403,8 @@ string_key: } if (UNEXPECTED(info)) { - if (UNEXPECTED(!zend_verify_property_type(info, data, 1))) { + data = zend_verify_property_type(info, data, &tmp, 1); + if (UNEXPECTED(!data)) { zval_dtor(&key); return 0; } From f4b40515868b4329c918a1f5fa2ef8acbd8f4d21 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 12:29:52 +0300 Subject: [PATCH 164/369] Changed behavior of uninitialized nullable properties (accoding to conversation with Joe) --- .../type_declarations/typed_properties_047.phpt | 12 +++++++----- .../type_declarations/typed_properties_048.phpt | 6 ++++-- Zend/zend_API.c | 2 +- Zend/zend_object_handlers.c | 3 ++- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_047.phpt b/Zend/tests/type_declarations/typed_properties_047.phpt index dc592769fa12..d3bdc239c573 100644 --- a/Zend/tests/type_declarations/typed_properties_047.phpt +++ b/Zend/tests/type_declarations/typed_properties_047.phpt @@ -48,13 +48,15 @@ try { echo $e->getMessage()."\n"; } ?> ---EXPECT-- -object(Foo)#1 (0) { +--EXPECTF-- +object(Foo)#1 (1) { ["foo"]=> - uninitialized(?integer) + NULL } -Typed property Foo::$foo must not be accessed before initialization +NULL int(5) NULL -Typed property Foo::$foo must not be accessed before initialization + +Notice: Undefined property: Foo::$foo in %styped_properties_047.php on line 38 +NULL Typed property Foo::$foo must be integer, string used diff --git a/Zend/tests/type_declarations/typed_properties_048.phpt b/Zend/tests/type_declarations/typed_properties_048.phpt index b0a7517e86ce..0bdb0f602f77 100644 --- a/Zend/tests/type_declarations/typed_properties_048.phpt +++ b/Zend/tests/type_declarations/typed_properties_048.phpt @@ -48,7 +48,7 @@ try { echo $e->getMessage()."\n"; } ?> ---EXPECT-- +--EXPECTF-- object(Foo)#1 (1) { ["foo"]=> NULL @@ -56,5 +56,7 @@ object(Foo)#1 (1) { NULL int(5) NULL -Typed property Foo::$foo must not be accessed before initialization + +Notice: Undefined property: Foo::$foo in %styped_properties_048.php on line 38 +NULL Typed property Foo::$foo must be integer, string used diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 885b0ffb9cf5..73db276aedfa 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3638,7 +3638,7 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name } } - if (Z_ISUNDEF_P(property) && !optional_type) { + if (Z_ISUNDEF_P(property) && (!optional_type || allow_null)) { ZVAL_NULL(property); } diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 5daaeae96385..53e41993ddb5 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -694,7 +694,8 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ } } if ((type != BP_VAR_IS)) { - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot))) { + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot)) + && UNEXPECTED(!prop_info->allow_null)) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(prop_info->ce->name), From e657bf8dc5a1cbb36a7cd3d3288948755e9575cd Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 12:43:37 +0300 Subject: [PATCH 165/369] Revert useless changes --- Zend/zend_ast.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index 80d6b016e89c..77259abe2a83 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -140,12 +140,12 @@ enum _zend_ast_kind { ZEND_AST_TRY, ZEND_AST_CATCH, ZEND_AST_PARAM, - ZEND_AST_CONST_ELEM, ZEND_AST_PROP_ELEM, + ZEND_AST_CONST_ELEM, /* 4 child nodes */ ZEND_AST_FOR = 4 << ZEND_AST_NUM_CHILDREN_SHIFT, - ZEND_AST_FOREACH + ZEND_AST_FOREACH, }; typedef uint16_t zend_ast_kind; From d46695d524fde219b84ce0186faadfa8bd88427a Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 12:49:39 +0300 Subject: [PATCH 166/369] Removed useless check (references are never fetched using FETCH_OBJ_RW) --- Zend/zend_vm_def.h | 7 ------ Zend/zend_vm_execute.h | 57 ------------------------------------------ 2 files changed, 64 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 0182b5b5315e..f97c1ac2b946 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1997,13 +1997,6 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) HANDLE_EXCEPTION(); } zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - FREE_OP2(); - FREE_OP1_VAR_PTR(); - HANDLE_EXCEPTION(); - } - FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index fc41a0dcc860..016b2f99f40d 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18304,12 +18304,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } - if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -23420,12 +23414,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } - if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -26640,13 +26628,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H HANDLE_EXCEPTION(); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } - zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -29423,12 +29404,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - - - HANDLE_EXCEPTION(); - } - if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -33180,12 +33155,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - - - HANDLE_EXCEPTION(); - } - if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -35824,13 +35793,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA HANDLE_EXCEPTION(); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - zval_ptr_dtor_nogc(free_op2); - - HANDLE_EXCEPTION(); - } - zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -41282,12 +41244,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - - - HANDLE_EXCEPTION(); - } - if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -48445,12 +48401,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - - - HANDLE_EXCEPTION(); - } - if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); } @@ -52738,13 +52688,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA HANDLE_EXCEPTION(); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - zval_ptr_dtor_nogc(free_op2); - - HANDLE_EXCEPTION(); - } - zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); From a53b8ace1b61aab3031da02a4cdef37c96eb5fe5 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 12:54:13 +0300 Subject: [PATCH 167/369] Removed duplicate code --- Zend/zend_vm_def.h | 12 ++--------- Zend/zend_vm_execute.h | 48 +++++++----------------------------------- 2 files changed, 10 insertions(+), 50 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index f97c1ac2b946..29e3cf373a97 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -5888,6 +5888,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { +ZEND_VM_C_LABEL(fe_reset_rw_typed): zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -5940,16 +5941,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) zend_bool is_empty; if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Typed properties exist in %s: foreach by reference is disallowed", - ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); - if (OP1_TYPE == IS_VAR) { - FREE_OP1_VAR_PTR(); - } else { - FREE_OP1(); - } - HANDLE_EXCEPTION(); + ZEND_VM_C_GOTO(fe_reset_rw_typed); } iter = ce->get_iterator(ce, array_ptr, 1); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 016b2f99f40d..839dc42f4093 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3561,6 +3561,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { +fe_reset_rw_typed: zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -3612,16 +3613,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER zend_bool is_empty; if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Typed properties exist in %s: foreach by reference is disallowed", - ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); - if (IS_CONST == IS_VAR) { - - } else { - - } - HANDLE_EXCEPTION(); + goto fe_reset_rw_typed; } iter = ce->get_iterator(ce, array_ptr, 1); @@ -12685,6 +12677,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_TMP_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { +fe_reset_rw_typed: zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -12736,16 +12729,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z zend_bool is_empty; if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Typed properties exist in %s: foreach by reference is disallowed", - ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); - if (IS_TMP_VAR == IS_VAR) { - - } else { - zval_ptr_dtor_nogc(free_op1); - } - HANDLE_EXCEPTION(); + goto fe_reset_rw_typed; } iter = ce->get_iterator(ce, array_ptr, 1); @@ -16233,6 +16217,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { +fe_reset_rw_typed: zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -16285,16 +16270,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z zend_bool is_empty; if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Typed properties exist in %s: foreach by reference is disallowed", - ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); - if (IS_VAR == IS_VAR) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - } else { - zval_ptr_dtor_nogc(free_op1); - } - HANDLE_EXCEPTION(); + goto fe_reset_rw_typed; } iter = ce->get_iterator(ce, array_ptr, 1); @@ -38687,6 +38663,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { +fe_reset_rw_typed: zend_throw_exception_ex( zend_ce_type_error, 0, "Typed properties exist in %s: foreach by reference is disallowed", @@ -38738,16 +38715,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE zend_bool is_empty; if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Typed properties exist in %s: foreach by reference is disallowed", - ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); - if (IS_CV == IS_VAR) { - - } else { - - } - HANDLE_EXCEPTION(); + goto fe_reset_rw_typed; } iter = ce->get_iterator(ce, array_ptr, 1); From d248c27ff5535ee92e75c889d6b194e1faa7873f Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 13:21:25 +0300 Subject: [PATCH 168/369] Added support for nullavle types in AST pretty printer --- .../tests/type_declarations/types_in_ast.phpt | 23 +++++++++++++++++++ Zend/zend_ast.c | 9 ++++++++ 2 files changed, 32 insertions(+) create mode 100644 Zend/tests/type_declarations/types_in_ast.phpt 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 000000000000..8958735dbba1 --- /dev/null +++ b/Zend/tests/type_declarations/types_in_ast.phpt @@ -0,0 +1,23 @@ +--TEST-- +AST pretty-peinter +--INI-- +zend.assertions=1 +assert.exception=0 +--FILE-- + +--EXPECTF-- +Warning: assert(): assert(0 && ($a = function (int $a, ?int $b, int $c = null): ?int { + $x = new class { + public $a; + public int $b; + public ?int $c; + }; +})) failed in %stypes_in_ast.php on line 2 diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index fb40acd6bf01..f80a0c97bc85 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -1061,6 +1061,9 @@ static void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int zend_ast_export_ex(str, decl->child[1], 0, indent); if (decl->child[3]) { smart_str_appends(str, ": "); + if (decl->child[3]->attr & ZEND_TYPE_NULLABLE) { + smart_str_appendc(str, '?'); + } zend_ast_export_ns_name(str, decl->child[3], 0, indent); } if (decl->child[2]) { @@ -1146,6 +1149,9 @@ static void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int } if (type_ast) { + if (type_ast->attr & ZEND_TYPE_NULLABLE) { + smart_str_appendc(str, '?'); + } zend_ast_export_name( str, type_ast, 0, indent); smart_str_appendc(str, ' '); @@ -1610,6 +1616,9 @@ static void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int break; case ZEND_AST_PARAM: if (ast->child[0]) { + if (ast->child[0]->attr & ZEND_TYPE_NULLABLE) { + smart_str_appendc(str, '?'); + } zend_ast_export_ns_name(str, ast->child[0], 0, indent); smart_str_appendc(str, ' '); } From e1017f904da8ac146fcdbd13e8f1fa02efcf4e9a Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 13:28:52 +0300 Subject: [PATCH 169/369] Revert useless change --- Zend/zend_ast.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index f80a0c97bc85..599ecba0ee6e 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -1500,8 +1500,7 @@ static void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int break; case ZEND_AST_PROP_ELEM: smart_str_appendc(str, '$'); - zend_ast_export_name(str, ast->child[0], 0, indent); - APPEND_DEFAULT_VALUE(1); + /* break missing intentionally */ case ZEND_AST_CONST_ELEM: zend_ast_export_name(str, ast->child[0], 0, indent); APPEND_DEFAULT_VALUE(1); From 291d4315a65e7939341a121c369ab5c935d40765 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 13:39:38 +0300 Subject: [PATCH 170/369] Added test (memory leaks) --- .../typed_properties_052.phpt | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_052.phpt 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 000000000000..418db0e37cf8 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_052.phpt @@ -0,0 +1,34 @@ +--TEST-- +Class properties declared in eval() must not leak +--FILE-- + +--EXPECT-- +object(A)#1 (3) { + ["a1"]=> + uninitialized(A) + ["b1"]=> + uninitialized(B) + ["c1"]=> + uninitialized(Foo\C) + ["a2"]=> + NULL + ["b2"]=> + NULL + ["c2"]=> + NULL +} From 40aa6c247c410da42badcf765a324a1d731859a5 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 13:50:40 +0300 Subject: [PATCH 171/369] "string" mat be also a valid "callable" --- .../typed_properties_053.phpt | 26 +++++++++++++++++++ .../typed_properties_054.phpt | 12 +++++++++ Zend/zend_compile.c | 4 +-- 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_053.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_054.phpt 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 000000000000..6fb25191dd14 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_053.phpt @@ -0,0 +1,26 @@ +--TEST-- +Default values of callable properties +--FILE-- + +--EXPECT-- +object(A)#1 (2) { + ["a1"]=> + uninitialized(callable) + ["a2"]=> + string(3) "foo" + ["a3"]=> + array(2) { + [0]=> + string(1) "A" + [1]=> + string(3) "bar" + } +} 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 000000000000..9155bcc124b6 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_054.phpt @@ -0,0 +1,12 @@ +--TEST-- +Default values of callable properties +--FILE-- + +--EXPECTF-- +Fatal error: Default value for properties with callable type can only be a string or an array in %styped_properties_054.php on line 3 \ No newline at end of file diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 24a96214c3e7..949da442523c 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5598,9 +5598,9 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ "Default value for properties with array type can only be an array"); } } else if (optional_type == IS_CALLABLE) { - if (Z_TYPE(value_zv) != IS_ARRAY) { + if (Z_TYPE(value_zv) != IS_STRING && Z_TYPE(value_zv) != IS_ARRAY) { zend_error_noreturn(E_COMPILE_ERROR, - "Default value for properties with callable type can only be an array"); + "Default value for properties with callable type can only be a string or an array"); } } else if (optional_type == IS_OBJECT) { zend_error_noreturn(E_COMPILE_ERROR, From 3143597281c2052fe49d35363c43d303840d8999 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 14:41:02 +0300 Subject: [PATCH 172/369] Removed unused function and macro --- Zend/zend_execute.h | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 50a1645154fb..7aa329b3f12e 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -366,26 +366,6 @@ void zend_cleanup_unfinished_execution(zend_execute_data *execute_data, uint32_t #define ZEND_CLASS_HAS_TYPE_HINTS(ce) ((ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) == ZEND_ACC_HAS_TYPE_HINTS) -static zend_always_inline zend_bool _zend_object_has_type_hints(zval *object) { - do { - if (Z_TYPE_P(object) != IS_OBJECT) { - if (Z_ISREF_P(object)) { - object = Z_REFVAL_P(object); - if (Z_TYPE_P(object) != IS_OBJECT) - break; - } else { - break; - } - } - - return ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)); - } while (0); - - return 0; -} - -#define ZEND_OBJECT_HAS_TYPE_HINTS(object) _zend_object_has_type_hints(object) - static zend_always_inline zend_property_info* zend_object_fetch_property_type_info_ex(zval *object, zend_string *property, void **cache_slot) { zend_property_info *info; From 4506a70a26a350b9eb2437983b197f4f7deec3e2 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 17:07:05 +0300 Subject: [PATCH 173/369] Optimization --- .../typed_properties_003.phpt | 6 +- Zend/zend_compile.c | 56 ++-- Zend/zend_compile.h | 2 +- Zend/zend_execute.c | 92 +++---- Zend/zend_object_handlers.c | 8 - Zend/zend_vm_def.h | 23 +- Zend/zend_vm_execute.h | 251 +++--------------- 7 files changed, 115 insertions(+), 323 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_003.phpt b/Zend/tests/type_declarations/typed_properties_003.phpt index 90ee16c61323..cf85fc409312 100644 --- a/Zend/tests/type_declarations/typed_properties_003.phpt +++ b/Zend/tests/type_declarations/typed_properties_003.phpt @@ -9,11 +9,7 @@ $thing = new class() { $var = &$thing->int; ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property class@anonymous::$int must not be accessed before initialization in %s:%d -Stack trace: -#0 {main} - -Next TypeError: Typed property class@anonymous::$int must not be referenced in %s:%d +Fatal error: Uncaught TypeError: Typed property class@anonymous::$int must not be referenced in %s:%d Stack trace: #0 {main} thrown in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 949da442523c..6b657d70570b 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2583,7 +2583,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); +void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, int by_ref); void zend_compile_assign(znode *result, zend_ast *ast); static void zend_compile_list_assign(znode *result, zend_ast *ast, znode *expr_node, zend_bool old_style); @@ -2608,7 +2608,7 @@ static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t znode var_node, dim_node; - zend_delayed_compile_var(&var_node, var_ast, type); + zend_delayed_compile_var(&var_node, var_ast, type, 0); zend_separate_if_call_and_write(&var_node, var_ast, type); if (dim_ast == NULL) { @@ -2665,7 +2665,7 @@ static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t if (is_this_fetch(obj_ast)) { obj_node.op_type = IS_UNUSED; } else { - zend_delayed_compile_var(&obj_node, obj_ast, type); + zend_delayed_compile_var(&obj_node, obj_ast, type, 0); zend_separate_if_call_and_write(&obj_node, obj_ast, type); } zend_compile_expr(&prop_node, prop_ast); @@ -2688,10 +2688,13 @@ static zend_op *zend_compile_prop_common(znode *result, zend_ast *ast, uint32_t } /* }}} */ -void zend_compile_prop(znode *result, zend_ast *ast, uint32_t type) /* {{{ */ +void zend_compile_prop(znode *result, zend_ast *ast, uint32_t type, int by_ref) /* {{{ */ { zend_op *opline = zend_compile_prop_common(result, ast, type); zend_adjust_for_fetch_type(opline, type); + if (by_ref) { + opline->extended_value = 1; + } } /* }}} */ @@ -2942,7 +2945,7 @@ void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */ 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); @@ -3003,8 +3006,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_delayed_compile_var(&source_node, source_ast, BP_VAR_W); + zend_delayed_compile_var(&target_node, target_ast, BP_VAR_W, 1); + zend_delayed_compile_var(&source_node, source_ast, BP_VAR_W, 1); zend_delayed_compile_end(offset); if (source_node.op_type != IS_VAR && zend_is_call(source_ast)) { @@ -3043,7 +3046,7 @@ void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */ 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); @@ -3110,7 +3113,7 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */ arg_count++; if (zend_is_variable(arg)) { if (zend_is_call(arg)) { - zend_compile_var(&arg_node, arg, BP_VAR_R); + zend_compile_var(&arg_node, arg, BP_VAR_R, 0); if (arg_node.op_type & (IS_CONST|IS_TMP_VAR)) { /* Function call was converted into builtin instruction */ opcode = ZEND_SEND_VAL; @@ -3126,15 +3129,15 @@ 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 = ZEND_SEND_VAR; } } else { zend_compile_var(&arg_node, arg, - BP_VAR_FUNC_ARG | (arg_num << BP_VAR_SHIFT)); + BP_VAR_FUNC_ARG | (arg_num << BP_VAR_SHIFT), 0); opcode = ZEND_SEND_VAR_EX; } } else { @@ -3512,7 +3515,7 @@ int zend_compile_func_cuf(znode *result, zend_ast_list *args, zend_string *lcnam zend_bool send_user = 0; if (zend_is_variable(arg_ast) && !zend_is_call(arg_ast)) { - zend_compile_var(&arg_node, arg_ast, BP_VAR_FUNC_ARG | (i << BP_VAR_SHIFT)); + zend_compile_var(&arg_node, arg_ast, BP_VAR_FUNC_ARG | (i << BP_VAR_SHIFT), 0); send_user = 1; } else { zend_compile_expr(&arg_node, arg_ast); @@ -4065,7 +4068,7 @@ void zend_compile_return(zend_ast *ast) /* {{{ */ expr_node.op_type = IS_CONST; ZVAL_NULL(&expr_node.u.constant); } else if (by_ref && zend_is_variable(expr_ast) && !zend_is_call(expr_ast)) { - zend_compile_var(&expr_node, expr_ast, BP_VAR_W); + zend_compile_var(&expr_node, expr_ast, BP_VAR_W, 1); } else { zend_compile_expr(&expr_node, expr_ast); } @@ -4384,7 +4387,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, 0); } else { zend_compile_expr(&expr_node, expr_ast); } @@ -6793,7 +6796,7 @@ void zend_compile_post_incdec(znode *result, zend_ast *ast) /* {{{ */ 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); } @@ -6812,7 +6815,7 @@ void zend_compile_pre_incdec(znode *result, zend_ast *ast) /* {{{ */ opline->opcode = ast->kind == ZEND_AST_PRE_INC ? ZEND_PRE_INC_OBJ : ZEND_PRE_DEC_OBJ; } 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); } @@ -6902,7 +6905,7 @@ void zend_compile_coalesce(znode *result, zend_ast *ast) /* {{{ */ zend_op *opline; uint32_t opnum; - zend_compile_var(&expr_node, expr_ast, BP_VAR_IS); + zend_compile_var(&expr_node, expr_ast, BP_VAR_IS, 0); opnum = get_next_op_number(CG(active_op_array)); zend_emit_op_tmp(result, ZEND_COALESCE, &expr_node, NULL); @@ -6969,7 +6972,7 @@ void zend_compile_yield(znode *result, zend_ast *ast) /* {{{ */ if (value_ast) { if (returns_by_ref && zend_is_variable(value_ast) && !zend_is_call(value_ast)) { - zend_compile_var(&value_node, value_ast, BP_VAR_W); + zend_compile_var(&value_node, value_ast, BP_VAR_W, 1); } else { zend_compile_expr(&value_node, value_ast); } @@ -7177,7 +7180,7 @@ void zend_compile_array(znode *result, zend_ast *ast) /* {{{ */ if (by_ref) { zend_ensure_writable_variable(value_ast); - zend_compile_var(&value_node, value_ast, BP_VAR_W); + zend_compile_var(&value_node, value_ast, BP_VAR_W, 1); } else { zend_compile_expr(&value_node, value_ast); } @@ -7817,7 +7820,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); @@ -7921,7 +7924,7 @@ void zend_compile_expr(znode *result, zend_ast *ast) /* {{{ */ } /* }}} */ -void zend_compile_var(znode *result, zend_ast *ast, uint32_t type) /* {{{ */ +void zend_compile_var(znode *result, zend_ast *ast, uint32_t type, int by_ref) /* {{{ */ { switch (ast->kind) { case ZEND_AST_VAR: @@ -7931,7 +7934,7 @@ void zend_compile_var(znode *result, zend_ast *ast, uint32_t type) /* {{{ */ zend_compile_dim(result, ast, type); return; case ZEND_AST_PROP: - zend_compile_prop(result, ast, type); + zend_compile_prop(result, ast, type, by_ref); return; case ZEND_AST_STATIC_PROP: zend_compile_static_prop(result, ast, type, 0); @@ -7960,7 +7963,7 @@ void zend_compile_var(znode *result, zend_ast *ast, uint32_t type) /* {{{ */ } /* }}} */ -void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type) /* {{{ */ +void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, int by_ref) /* {{{ */ { zend_op *opline; switch (ast->kind) { @@ -7974,12 +7977,15 @@ void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type) /* {{ case ZEND_AST_PROP: opline = zend_delayed_compile_prop(result, ast, type); zend_adjust_for_fetch_type(opline, type); + if (by_ref) { + opline->extended_value = 1; + } return; case ZEND_AST_STATIC_PROP: zend_compile_static_prop(result, ast, type, 1); return; default: - zend_compile_var(result, ast, type); + zend_compile_var(result, ast, type, 0); return; } } diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 37cef5d38214..4609d746dadf 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -132,7 +132,7 @@ typedef union _zend_parser_stack_elem { void zend_compile_top_stmt(zend_ast *ast); void zend_compile_stmt(zend_ast *ast); void zend_compile_expr(znode *node, zend_ast *ast); -void zend_compile_var(znode *node, zend_ast *ast, uint32_t type); +void 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); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 7590e8680d36..ad58d1751e43 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -178,48 +178,6 @@ ZEND_API void* zend_vm_stack_extend(size_t size) return ptr; } -static zend_bool zend_vm_is_fetching_reference(const zend_op * opline) -{ - zend_op const *next = opline + 1; - - while (1) { - switch (next->opcode) { - case ZEND_NOP: - case ZEND_TICKS: - case ZEND_EXT_STMT: - case ZEND_FETCH_DIM_W: - case ZEND_FETCH_W: - case ZEND_FETCH_OBJ_W: - next++; - break; - case ZEND_SEND_REF: - case ZEND_RETURN_BY_REF: - case ZEND_ASSIGN_REF: - case ZEND_INIT_ARRAY: - case ZEND_ADD_ARRAY_ELEMENT: - case ZEND_YIELD: - return 1; - default: - return 0; - } - } -} - -static zend_always_inline zend_bool zend_is_referenced_typed_property(zval *container, zval *property, void **cache_slot, const zend_op *opline, int check_opline) -{ - zend_property_info *prop_info = zend_object_fetch_property_type_info(container, property, cache_slot); - - if (UNEXPECTED(prop_info) - && (!check_opline || UNEXPECTED(zend_vm_is_fetching_reference(opline)))) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(property)); - return 1; - } - return 0; -} - ZEND_API zval* zend_get_compiled_variable_value(const zend_execute_data *execute_data, uint32_t var) { return EX_VAR(var); @@ -856,9 +814,9 @@ static zend_always_inline zval* i_zend_verify_property_type(zend_property_info * { if (EXPECTED(info->type == Z_TYPE_P(property))) { if (info->type_name) { - zend_string *resolved = zend_resolve_property_type(info->type_name, info->ce); - if (!info->type_ce) { + zend_string *resolved = zend_resolve_property_type(info->type_name, info->ce); + info->type_ce = zend_lookup_class(resolved); if (!info->type_ce) { return NULL; @@ -2088,8 +2046,10 @@ ZEND_API void zend_fetch_dimension_by_zval_is(zval *result, zval *container, zva } -static zend_always_inline void zend_fetch_property_address(zval *result, zval *container, uint32_t container_op_type, zval *prop_ptr, uint32_t prop_op_type, void **cache_slot, int type) +static zend_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, int by_ref) { + zval *ptr; + if (container_op_type != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { do { if (container_op_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(container))) { @@ -2121,12 +2081,32 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c EXPECTED(Z_OBJCE_P(container) == CACHED_PTR_EX(cache_slot))) { uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1); zend_object *zobj = Z_OBJ_P(container); - zval *retval; if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { - 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)) { +return_indirect: + ZVAL_INDIRECT(result, ptr); + if (by_ref + && (prop_op_type == IS_CONST + || EXPECTED(Z_TYPE_P(prop_ptr) == IS_STRING))) { + zend_property_info *prop_info; + + if (prop_op_type == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(container), Z_STR_P(prop_ptr), 1); + } + if (UNEXPECTED(prop_info) + && (prop_op_type == IS_CONST + || UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Typed property %s::$%s must not be referenced", + ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(prop_ptr)); + } + } return; } } else if (EXPECTED(zobj->properties != NULL)) { @@ -2136,20 +2116,20 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } zobj->properties = zend_array_dup(zobj->properties); } - retval = zend_hash_find(zobj->properties, Z_STR_P(prop_ptr)); - if (EXPECTED(retval)) { - ZVAL_INDIRECT(result, retval); + ptr = zend_hash_find(zobj->properties, Z_STR_P(prop_ptr)); + 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); + 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)) { ptr = Z_OBJ_HT_P(container)->read_property(container, prop_ptr, type, cache_slot, result); if (ptr != result) { - ZVAL_INDIRECT(result, ptr); + goto return_indirect; } else if (UNEXPECTED(Z_ISREF_P(ptr) && Z_REFCOUNT_P(ptr) == 1)) { ZVAL_UNREF(ptr); } @@ -2158,12 +2138,12 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c ZVAL_ERROR(result); } } else { - ZVAL_INDIRECT(result, ptr); + goto return_indirect; } } else if (EXPECTED(Z_OBJ_HT_P(container)->read_property)) { zval *ptr = Z_OBJ_HT_P(container)->read_property(container, prop_ptr, type, cache_slot, result); if (ptr != result) { - ZVAL_INDIRECT(result, ptr); + goto return_indirect; } else if (UNEXPECTED(Z_ISREF_P(ptr) && Z_REFCOUNT_P(ptr) == 1)) { ZVAL_UNREF(ptr); } diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 53e41993ddb5..8092a81b38b0 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -944,14 +944,6 @@ static zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type, fprintf(stderr, "Ptr object #%d property: %s\n", Z_OBJ_HANDLE_P(object), ZSTR_VAL(name)); #endif - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce))) { - zend_property_info *prop_info = zend_hash_find_ptr(&zobj->ce->properties_info, name); - - if (prop_info && prop_info->type) { - return NULL; - } - } - property_offset = zend_get_property_offset(zobj->ce, name, (zobj->ce->__get != NULL), cache_slot); if (EXPECTED(property_offset != ZEND_WRONG_PROPERTY_OFFSET)) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 29e3cf373a97..e931aa285203 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1964,14 +1964,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - FREE_OP2(); - FREE_OP1_VAR_PTR(); - HANDLE_EXCEPTION(); - } - + zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -1996,7 +1989,7 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) FREE_OP2(); HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); + zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW, 0); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -2103,15 +2096,7 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST FREE_OP1_VAR_PTR(); HANDLE_EXCEPTION(); } - - zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { - FREE_OP2(); - FREE_OP1_VAR_PTR(); - HANDLE_EXCEPTION(); - } - + zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -2140,7 +2125,7 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) property = GET_OP2_ZVAL_PTR(BP_VAR_R); - zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); + zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET, 0); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 839dc42f4093..d0ecee77c55a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5074,14 +5074,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } - - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { - - - HANDLE_EXCEPTION(); - } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -8900,14 +8893,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } - - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { - - - HANDLE_EXCEPTION(); - } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -10814,15 +10800,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } - - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { - zval_ptr_dtor_nogc(free_op2); - - HANDLE_EXCEPTION(); - } - + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); zval_ptr_dtor_nogc(free_op2); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -13228,14 +13206,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO HANDLE_EXCEPTION(); } - - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { - - - HANDLE_EXCEPTION(); - } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -14453,14 +14424,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV HANDLE_EXCEPTION(); } - - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { - - - HANDLE_EXCEPTION(); - } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -14982,15 +14946,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM HANDLE_EXCEPTION(); } - - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { - zval_ptr_dtor_nogc(free_op2); - - HANDLE_EXCEPTION(); - } - + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); zval_ptr_dtor_nogc(free_op2); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -18247,13 +18203,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -18278,7 +18228,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW, 0); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -18312,14 +18262,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { - - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -18348,7 +18291,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST property = EX_CONSTANT(opline->op2); - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET, 0); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -23357,13 +23300,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -23388,7 +23325,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW, 0); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -23422,14 +23359,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { - - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -23458,7 +23388,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HA property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET, 0); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -26571,14 +26501,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } - + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -26603,7 +26526,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW, 0); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -26637,15 +26560,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } - + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -26674,7 +26589,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVA property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET, 0); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -29347,13 +29262,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - - - HANDLE_EXCEPTION(); - } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -29378,7 +29287,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW, 0); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -29484,14 +29393,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } - - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { - - - HANDLE_EXCEPTION(); - } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -29520,7 +29422,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CO property = EX_CONSTANT(opline->op2); - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET, 0); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -33098,13 +33000,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - - - HANDLE_EXCEPTION(); - } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -33129,7 +33025,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW, 0); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -33235,14 +33131,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } - - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { - - - HANDLE_EXCEPTION(); - } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -33271,7 +33160,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET, 0); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -35736,14 +35625,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - zval_ptr_dtor_nogc(free_op2); - - HANDLE_EXCEPTION(); - } - + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -35768,7 +35650,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW, 0); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -35875,15 +35757,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } - - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { - zval_ptr_dtor_nogc(free_op2); - - HANDLE_EXCEPTION(); - } - + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -35912,7 +35786,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TM property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET, 0); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -41179,13 +41053,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - - - HANDLE_EXCEPTION(); - } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -41210,7 +41078,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW, 0); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -41316,14 +41184,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON HANDLE_EXCEPTION(); } - - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { - - - HANDLE_EXCEPTION(); - } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -41352,7 +41213,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_ property = EX_CONSTANT(opline->op2); - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET, 0); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -48336,13 +48197,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - - - HANDLE_EXCEPTION(); - } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -48367,7 +48222,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW, 0); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -48473,14 +48328,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ HANDLE_EXCEPTION(); } - - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { - - - HANDLE_EXCEPTION(); - } + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -48509,7 +48357,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HAN property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET, 0); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -52623,14 +52471,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 1))) { - zval_ptr_dtor_nogc(free_op2); - - HANDLE_EXCEPTION(); - } - + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -52655,7 +52496,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW, 0); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -52762,15 +52603,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP HANDLE_EXCEPTION(); } - - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); - - if (UNEXPECTED(zend_is_referenced_typed_property(container, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), opline, 0))) { - zval_ptr_dtor_nogc(free_op2); - - HANDLE_EXCEPTION(); - } - + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -52799,7 +52632,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET, 0); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); From 05dd2e462aab2543a5caf2b9c1cf90d6014c1b27 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 17:13:49 +0300 Subject: [PATCH 174/369] Removed unused zend_object_fetch_property_type_info() and renamed zend_object_fetch_property_type_info_ex() into zend_object_fetch_property_type_info() --- Zend/zend_execute.h | 16 ++-------------- Zend/zend_object_handlers.c | 8 ++++---- ext/standard/var.c | 4 ++-- 3 files changed, 8 insertions(+), 20 deletions(-) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 7aa329b3f12e..f670eeb78da3 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -366,7 +366,8 @@ void zend_cleanup_unfinished_execution(zend_execute_data *execute_data, uint32_t #define ZEND_CLASS_HAS_TYPE_HINTS(ce) ((ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) == ZEND_ACC_HAS_TYPE_HINTS) -static zend_always_inline zend_property_info* zend_object_fetch_property_type_info_ex(zval *object, zend_string *property, void **cache_slot) { +static zend_always_inline zend_property_info* zend_object_fetch_property_type_info(zval *object, zend_string *property, void **cache_slot) +{ zend_property_info *info; /* if we have a cache_slot, let's assume it's valid. Callers task to ensure validity! */ @@ -387,19 +388,6 @@ static zend_always_inline zend_property_info* zend_object_fetch_property_type_in return NULL; } -static zend_always_inline zend_property_info* zend_object_fetch_property_type_info(zval *object, zval *property, void **cache_slot) -{ - if (EXPECTED(cache_slot)) { - return (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - } - - if (UNEXPECTED(Z_TYPE_P(property) != IS_STRING)) { - return NULL; - } - - return zend_object_fetch_property_type_info_ex(object, Z_STR_P(property), cache_slot); -} - zval* zend_verify_property_type(zend_property_info *info, zval *property, zval *tmp, zend_bool strict); ZEND_COLD void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property); diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 8092a81b38b0..898b4ec39833 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -676,7 +676,7 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ zval_ptr_dtor(&tmp_object); if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) && - (prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot)))) { + (prop_info = zend_object_fetch_property_type_info(object, Z_STR_P(member), cache_slot)))) { zval tmp, *val; val = zend_verify_property_type(prop_info, retval, &tmp, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES) != 0); @@ -694,7 +694,7 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ } } if ((type != BP_VAR_IS)) { - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot)) + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(object, Z_STR_P(member), cache_slot)) && UNEXPECTED(!prop_info->allow_null)) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", @@ -737,7 +737,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) { variable_ptr = OBJ_PROP(zobj, property_offset); if (Z_TYPE_P(variable_ptr) != IS_UNDEF) { - zend_property_info *prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), cache_slot); + zend_property_info *prop_info = zend_object_fetch_property_type_info(object, Z_STR_P(member), cache_slot); zval tmp, *val; if (UNEXPECTED(prop_info)) { @@ -806,7 +806,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v zend_property_info *prop_info; zval tmp, *val; - if (cache_slot ? UNEXPECTED(prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2)) : UNEXPECTED(prop_info = zend_object_fetch_property_type_info_ex(object, Z_STR_P(member), NULL))) { + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(object, Z_STR_P(member), cache_slot))) { val = zend_verify_property_type(prop_info, value, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(member), value); diff --git a/ext/standard/var.c b/ext/standard/var.c index 16e05cd76526..614c35a3638d 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -178,7 +178,7 @@ PHPAPI void php_var_dump(zval *struc, int level) /* {{{ */ } if (key) { - prop_info = zend_object_fetch_property_type_info_ex(struc, key, NULL); + prop_info = zend_object_fetch_property_type_info(struc, key, NULL); } if (!Z_ISUNDEF_P(val) || prop_info) { @@ -369,7 +369,7 @@ PHPAPI void php_debug_zval_dump(zval *struc, int level) /* {{{ */ } if (key) { - prop_info = zend_object_fetch_property_type_info_ex(struc, key, NULL); + prop_info = zend_object_fetch_property_type_info(struc, key, NULL); } if (!Z_ISUNDEF_P(val) || prop_info) { From 023df779628157bd07121fc05f9ee8763a7788ab Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 17:57:29 +0300 Subject: [PATCH 175/369] Fixed wrong exception when passing element of typed property by reference. --- .../typed_properties_055.phpt | 27 +++++++++++++++++ Zend/zend_compile.c | 8 ++--- Zend/zend_compile.h | 1 + Zend/zend_execute.c | 4 +-- Zend/zend_vm_def.h | 6 ++-- Zend/zend_vm_execute.h | 30 +++++++++---------- Zend/zend_vm_gen.php | 4 ++- Zend/zend_vm_opcodes.c | 4 +-- Zend/zend_vm_opcodes.h | 1 + ext/opcache/Optimizer/zend_dump.c | 5 ++++ 10 files changed, 63 insertions(+), 27 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_055.phpt 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 000000000000..16c958acf33d --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_055.phpt @@ -0,0 +1,27 @@ +--TEST-- +Default values of callable properties +--FILE-- +a = new A; +$f($o->a->foo); +$f($o->a->bar); +?> +--EXPECTF-- +int(1) + +Fatal error: Uncaught TypeError: Typed property A::$bar must not be referenced in %styped_properties_055.php:16 +Stack trace: +#0 {main} + thrown in %styped_properties_055.php on line 16 diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 6b657d70570b..3505b185bd73 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2693,7 +2693,7 @@ void zend_compile_prop(znode *result, zend_ast *ast, uint32_t type, int by_ref) zend_op *opline = zend_compile_prop_common(result, ast, type); zend_adjust_for_fetch_type(opline, type); if (by_ref) { - opline->extended_value = 1; + opline->extended_value |= ZEND_FETCH_REF; } } /* }}} */ @@ -3137,7 +3137,7 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */ } } else { zend_compile_var(&arg_node, arg, - BP_VAR_FUNC_ARG | (arg_num << BP_VAR_SHIFT), 0); + BP_VAR_FUNC_ARG | (arg_num << BP_VAR_SHIFT), 1); opcode = ZEND_SEND_VAR_EX; } } else { @@ -3515,7 +3515,7 @@ int zend_compile_func_cuf(znode *result, zend_ast_list *args, zend_string *lcnam zend_bool send_user = 0; if (zend_is_variable(arg_ast) && !zend_is_call(arg_ast)) { - zend_compile_var(&arg_node, arg_ast, BP_VAR_FUNC_ARG | (i << BP_VAR_SHIFT), 0); + zend_compile_var(&arg_node, arg_ast, BP_VAR_FUNC_ARG | (i << BP_VAR_SHIFT), 1); send_user = 1; } else { zend_compile_expr(&arg_node, arg_ast); @@ -7978,7 +7978,7 @@ void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, int b opline = zend_delayed_compile_prop(result, ast, type); zend_adjust_for_fetch_type(opline, type); if (by_ref) { - opline->extended_value = 1; + opline->extended_value |= ZEND_FETCH_REF; } return; case ZEND_AST_STATIC_PROP: diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 4609d746dadf..1b23eed78013 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -894,6 +894,7 @@ ZEND_API void zend_assert_valid_class_name(const zend_string *const_name); #define ZEND_ISEMPTY 0x01000000 #define ZEND_ISSET_ISEMPTY_MASK (ZEND_ISSET | ZEND_ISEMPTY) #define ZEND_QUICK_SET 0x00800000 +#define ZEND_FETCH_REF 0x00400000 #define ZEND_FETCH_ARG_MASK 0x000fffff diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index ad58d1751e43..88e392d95b94 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2046,7 +2046,7 @@ ZEND_API void zend_fetch_dimension_by_zval_is(zval *result, zval *container, zva } -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, int by_ref) +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 by_ref) { zval *ptr; @@ -2087,7 +2087,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (EXPECTED(Z_TYPE_P(ptr) != IS_UNDEF)) { return_indirect: ZVAL_INDIRECT(result, ptr); - if (by_ref + if ((by_ref & ZEND_FETCH_REF) && (prop_op_type == IS_CONST || EXPECTED(Z_TYPE_P(prop_ptr) == IS_STRING))) { zend_property_info *prop_info; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index e931aa285203..182d1ba4775c 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1947,7 +1947,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) +ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF) { USE_OPLINE zend_free_op free_op1, free_op2; @@ -2071,7 +2071,7 @@ ZEND_VM_C_LABEL(fetch_obj_is_no_object): ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, NUM) +ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, NUM|FETCH_REF) { USE_OPLINE zval *container; @@ -2096,7 +2096,7 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST FREE_OP1_VAR_PTR(); HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); + zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index d0ecee77c55a..f8d9545d3fcc 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5074,7 +5074,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -8893,7 +8893,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -10800,7 +10800,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); zval_ptr_dtor_nogc(free_op2); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -13206,7 +13206,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -14424,7 +14424,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -14946,7 +14946,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); zval_ptr_dtor_nogc(free_op2); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -18262,7 +18262,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -23359,7 +23359,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -26560,7 +26560,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -29393,7 +29393,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -33131,7 +33131,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -35757,7 +35757,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -41184,7 +41184,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -48328,7 +48328,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); @@ -52603,7 +52603,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP HANDLE_EXCEPTION(); } - zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, 1); + zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W, opline->extended_value); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index 03d9817c6be4..9e2944ad1e5f 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -74,9 +74,10 @@ "ZEND_VM_EXT_ARG_NUM" => 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_MASK" => 0x0f000000, "ZEND_VM_EXT_NUM" => 0x01000000, - // unused 0x2000000 + // unused 0x02000000, "ZEND_VM_EXT_JMP_ADDR" => 0x03000000, "ZEND_VM_EXT_DIM_OBJ" => 0x04000000, "ZEND_VM_EXT_CLASS_FETCH" => 0x05000000, @@ -129,6 +130,7 @@ "REF" => ZEND_VM_EXT_REF, "SRC" => ZEND_VM_EXT_SRC, "SEND" => ZEND_VM_EXT_SEND, + "FETCH_REF" => ZEND_VM_EXT_FETCH_REF, ); $vm_kind_name = array( diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 5463f9c49886..9ea4d2100d12 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -294,7 +294,7 @@ static uint32_t zend_vm_opcodes_flags[184] = { 0x00000753, 0x00010107, 0x00006701, - 0x00000751, + 0x00200751, 0x00010107, 0x00006701, 0x00000751, @@ -303,7 +303,7 @@ static uint32_t zend_vm_opcodes_flags[184] = { 0x00000757, 0x00050107, 0x01006703, - 0x01000753, + 0x01200753, 0x00010107, 0x00000701, 0x00000751, diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index 4f5a0d615a27..a3c7a3b9e40f 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -46,6 +46,7 @@ #define ZEND_VM_EXT_ARG_NUM 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_MASK 0x0f000000 #define ZEND_VM_EXT_NUM 0x01000000 #define ZEND_VM_EXT_JMP_ADDR 0x03000000 diff --git a/ext/opcache/Optimizer/zend_dump.c b/ext/opcache/Optimizer/zend_dump.c index c306c7ac1e3f..9429156b8713 100644 --- a/ext/opcache/Optimizer/zend_dump.c +++ b/ext/opcache/Optimizer/zend_dump.c @@ -555,6 +555,11 @@ static void zend_dump_op(const zend_op_array *op_array, const zend_basic_block * fprintf(stderr, " (ref)"); } } + if (ZEND_VM_EXT_FETCH_REF & flags) { + if (opline->extended_value & ZEND_FETCH_REF) { + fprintf(stderr, " (ref)"); + } + } } if (opline->op1_type == IS_CONST) { From 56e2aaa11e8c13e95ddf6e1d7dfb9b1823c25c48 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 19:24:11 +0300 Subject: [PATCH 176/369] Optimisation --- Zend/zend_execute.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 88e392d95b94..81e2e98f80b5 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -815,11 +815,19 @@ static zend_always_inline zval* i_zend_verify_property_type(zend_property_info * if (EXPECTED(info->type == Z_TYPE_P(property))) { if (info->type_name) { if (!info->type_ce) { - zend_string *resolved = zend_resolve_property_type(info->type_name, info->ce); - - info->type_ce = zend_lookup_class(resolved); - if (!info->type_ce) { - return NULL; + if (zend_string_equals_literal_ci(info->type_name, "self")) { + info->type_ce = info->ce; + } else if (zend_string_equals_literal_ci(info->type_name, "parent")) { + if (UNEXPECTED(!info->ce->parent)) { + zend_throw_error(NULL, "Cannot access parent:: when current class scope has no parent"); + return NULL; + } + info->type_ce = info->ce->parent; + } else { + info->type_ce = zend_lookup_class(info->type_name); + if (!info->type_ce) { + return NULL; + } } } From d7f313e5c320758264bb4599ec6cfb347e07f797 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 19:36:37 +0300 Subject: [PATCH 177/369] Added test (failed with valgrind) --- .../typed_properties_056.phpt | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_056.phpt 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 000000000000..e6d6e6338e1e --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_056.phpt @@ -0,0 +1,23 @@ +--TEST-- +Type change in assign_op (use-after-free) +--FILE-- +foo = "1" . str_repeat("0", 2); +try { + $o->foo += 5; +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; +} +var_dump($o->foo); +unset($o); +?> +--EXPECT-- +Typed property A::$foo must be string, integer used +string(3) "100" \ No newline at end of file From 892994d15e4cb3d47dc215f3c64f5cb139640f12 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 20:10:10 +0300 Subject: [PATCH 178/369] Added test (failed with valgrind) --- .../typed_properties_057.phpt | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_057.phpt 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 000000000000..4b98dd18f348 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_057.phpt @@ -0,0 +1,23 @@ +--TEST-- +Type change in pre-increment (use-after-free) +--FILE-- +foo = "1" . str_repeat("0", 2); +try { + $x = ++$o->foo; +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; +} +var_dump($o->foo); +unset($o); +?> +--EXPECT-- +Typed property A::$foo must be string, integer used +string(3) "100" From b0dcf0c82aaace45723e15375e3d5070965ce226 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 22:45:40 +0300 Subject: [PATCH 179/369] Fixed memory leak --- Zend/zend_opcode.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 0b5fe75ff8b0..ade3ba7c460d 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -282,6 +282,9 @@ ZEND_API void destroy_zend_class(zval *zv) if (prop_info->doc_comment) { zend_string_release(prop_info->doc_comment); } + if (prop_info->type_name) { + zend_string_release(prop_info->type_name); + } } } ZEND_HASH_FOREACH_END(); zend_hash_destroy(&ce->properties_info); From 2019f660d47b3b034a4485f0ff8c3a02b800409d Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 23:02:23 +0300 Subject: [PATCH 180/369] Check type after constant resolution --- .../typed_properties_058.phpt | 33 +++++++++++++++++++ Zend/zend_API.c | 11 +++++++ 2 files changed, 44 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_058.phpt 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 000000000000..18fae533a038 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_058.phpt @@ -0,0 +1,33 @@ +--TEST-- +Constants in default values of properties +--FILE-- +foo); +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; +} + +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, integer used diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 73db276aedfa..799d4624d834 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1147,6 +1147,17 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */ if (UNEXPECTED(zval_update_constant_ex(val, ce) != SUCCESS)) { return FAILURE; } + if (prop_info->type) { + zval tmp, *v; + + v = zend_verify_property_type(prop_info, val, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); + if (UNEXPECTED(!v)) { + zend_verify_property_type_error(prop_info, prop_info->name, val); + return FAILURE; + } else if (val != v) { + ZVAL_COPY_VALUE(val, v); + } + } } } } ZEND_HASH_FOREACH_END(); From c304c6b761577aad02ea1555a43ffe2920fb16f8 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 May 2016 23:17:56 +0300 Subject: [PATCH 181/369] Support for type checks of named constants in property default values. --- .../typed_properties_058.phpt | 14 +++++++----- Zend/zend_API.c | 22 ++++++++++++------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_058.phpt b/Zend/tests/type_declarations/typed_properties_058.phpt index 18fae533a038..2be5aa7aba8d 100644 --- a/Zend/tests/type_declarations/typed_properties_058.phpt +++ b/Zend/tests/type_declarations/typed_properties_058.phpt @@ -21,13 +21,17 @@ try { echo $e->getMessage() . "\n"; } -try { - $o = new B(); - var_dump($o->foo); -} catch (Throwable $e) { - echo $e->getMessage() . "\n"; +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, integer used +Typed property B::$foo must be string, integer used + diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 799d4624d834..379f8c4705b7 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1087,6 +1087,7 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */ if (class_type->parent) { if (UNEXPECTED(zend_update_class_constants(class_type->parent) != SUCCESS)) { + class_type->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; return FAILURE; } } @@ -1144,19 +1145,24 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */ } ZVAL_DEREF(val); if (Z_CONSTANT_P(val)) { - if (UNEXPECTED(zval_update_constant_ex(val, ce) != SUCCESS)) { - return FAILURE; - } if (prop_info->type) { - zval tmp, *v; + zval tmp, tmp2, *v; - v = zend_verify_property_type(prop_info, val, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); + ZVAL_COPY(&tmp, val); + if (UNEXPECTED(zval_update_constant_ex(&tmp, ce) != SUCCESS)) { + return FAILURE; + } + v = zend_verify_property_type(prop_info, &tmp, &tmp2, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); if (UNEXPECTED(!v)) { - zend_verify_property_type_error(prop_info, prop_info->name, val); + zend_verify_property_type_error(prop_info, prop_info->name, &tmp); + class_type->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; + zval_ptr_dtor(&tmp); return FAILURE; - } else if (val != v) { - ZVAL_COPY_VALUE(val, v); } + zval_ptr_dtor(val); + ZVAL_COPY_VALUE(val, v); + } else if (UNEXPECTED(zval_update_constant_ex(val, ce) != SUCCESS)) { + return FAILURE; } } } From b2cebf66275bf3ad5a98934a4b061a84c9448d3b Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 26 May 2016 11:39:19 +0300 Subject: [PATCH 182/369] Fixed memory leaks --- Zend/zend_execute.c | 76 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 17 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 81e2e98f80b5..a4a800adbb5a 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1516,7 +1516,8 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, zval rv; if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) { - zval *z, obj, prev; + zval *z, obj; + zend_property_info *prop_info; ZVAL_OBJ(&obj, Z_OBJ_P(object)); Z_ADDREF(obj); @@ -1535,23 +1536,45 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, } ZVAL_COPY_VALUE(z, value); } + + if (EXPECTED(cache_slot)) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE(obj), Z_STR_P(property), 1); + } + + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy; + + ZVAL_DUP(&z_copy, z); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + if (UNEXPECTED(result)) { + ZVAL_COPY(result, &z_copy); + } + Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot); + OBJ_RELEASE(Z_OBJ(obj)); + zval_ptr_dtor(&z_copy); + return; + } + ZVAL_DEREF(z); SEPARATE_ZVAL_NOREF(z); - ZVAL_COPY_VALUE(&prev, z); if (inc) { increment_function(z); } else { decrement_function(z); } - if (UNEXPECTED(result)) { - ZVAL_COPY(result, z); - } Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); - - if (UNEXPECTED(EG(exception))) { - ZVAL_COPY_VALUE(z, &prev); + if (UNEXPECTED(result) && EXPECTED(!EG(exception))) { + ZVAL_COPY(result, z); } - OBJ_RELEASE(Z_OBJ(obj)); zval_ptr_dtor(z); } else { @@ -1565,8 +1588,9 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, static zend_never_inline void zend_assign_op_overloaded_property(zval *object, zval *property, void **cache_slot, zval *value, binary_op_type binary_op, zval *result) { zval *z; - zval rv, obj, prev; + zval rv, obj; zval *zptr; + zend_property_info *prop_info; ZVAL_OBJ(&obj, Z_OBJ_P(object)); Z_ADDREF(obj); @@ -1585,20 +1609,38 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z } ZVAL_COPY_VALUE(z, value); } + + if (EXPECTED(cache_slot)) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE(obj), Z_STR_P(property), 1); + } + + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy; + + ZVAL_DUP(&z_copy, z); + binary_op(&z_copy, &z_copy, value); + Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot); + if (UNEXPECTED(result) && EXPECTED(!EG(exception))) { + ZVAL_COPY(result, z); + } + zval_ptr_dtor(&z_copy); + OBJ_RELEASE(Z_OBJ(obj)); + return; + } + zptr = z; ZVAL_DEREF(z); SEPARATE_ZVAL_NOREF(z); - - ZVAL_COPY_VALUE(&prev, z); binary_op(z, z, value); - Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); if (UNEXPECTED(result)) { ZVAL_COPY(result, z); } - if (UNEXPECTED(EG(exception))) { - ZVAL_COPY_VALUE(z, &prev); - } zval_ptr_dtor(zptr); } else { zend_error(E_WARNING, "Attempt to assign property of non-object"); @@ -2105,7 +2147,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } else { prop_info = zend_get_property_info(Z_OBJCE_P(container), Z_STR_P(prop_ptr), 1); } - if (UNEXPECTED(prop_info) + if (EXPECTED(prop_info) && (prop_op_type == IS_CONST || UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) && UNEXPECTED(prop_info->type)) { From 8bc20782cc522f11089046f33464770d448a2c95 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 26 May 2016 13:54:12 +0300 Subject: [PATCH 183/369] Faster +=/++/-- --- .../typed_properties_057.phpt | 10 +- Zend/zend_vm_def.h | 171 +- Zend/zend_vm_execute.h | 1521 +++++++++++++++-- 3 files changed, 1490 insertions(+), 212 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_057.phpt b/Zend/tests/type_declarations/typed_properties_057.phpt index 4b98dd18f348..fefe8d0738d7 100644 --- a/Zend/tests/type_declarations/typed_properties_057.phpt +++ b/Zend/tests/type_declarations/typed_properties_057.phpt @@ -1,5 +1,5 @@ --TEST-- -Type change in pre-increment (use-after-free) +Type change in pre/post-increment (use-after-free) --FILE-- 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, integer used string(3) "100" +Typed property A::$foo must be string, integer used +string(3) "100" diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 182d1ba4775c..d7fc6f603e88 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -707,6 +707,8 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, 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); @@ -735,9 +737,9 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } /* here we are sure we are dealing with an object */ + cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -746,13 +748,37 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, ZVAL_DEREF(zptr); SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if (OP2_TYPE == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + binary_op(&z_copy, &z_copy, value); + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } + } else { + binary_op(zptr, zptr, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -1145,6 +1171,8 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW); @@ -1170,9 +1198,9 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } /* here we are sure we are dealing with an object */ + cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -1184,22 +1212,71 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if (OP2_TYPE == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - - if (inc) { - increment_function(zptr); + + if (OP2_TYPE == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } } else { - decrement_function(zptr); + SEPARATE_ZVAL_NOREF(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -1225,6 +1302,8 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW); @@ -1248,10 +1327,9 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } /* here we are sure we are dealing with an object */ - + cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { @@ -1262,19 +1340,68 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if (OP2_TYPE == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); + + if (OP2_TYPE == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - decrement_function(zptr); + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + ZVAL_COPY_VALUE(zptr, val); + } + } else { + zval_opt_copy_ctor(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } } } else { - zend_post_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc, EX_VAR(opline->result.var)); } } while (0); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index f8d9545d3fcc..e7b5177d7f23 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -16961,6 +16961,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP 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, execute_data, &free_op1); @@ -16989,9 +16991,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -17000,13 +17002,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_DEREF(zptr); SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + binary_op(&z_copy, &z_copy, value); + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } + } else { + binary_op(zptr, zptr, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -17877,6 +17903,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -17902,9 +17930,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -17916,22 +17944,71 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - decrement_function(zptr); + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } + } else { + SEPARATE_ZVAL_NOREF(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -17956,6 +18033,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -17979,10 +18058,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } /* here we are sure we are dealing with an object */ - + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { @@ -17993,19 +18071,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + ZVAL_COPY_VALUE(zptr, val); + } } else { - decrement_function(zptr); + zval_opt_copy_ctor(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc, EX_VAR(opline->result.var)); } } while (0); @@ -22058,6 +22185,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP 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, execute_data, &free_op1); @@ -22086,9 +22215,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -22097,13 +22226,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_DEREF(zptr); SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + binary_op(&z_copy, &z_copy, value); + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } + } else { + binary_op(zptr, zptr, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -22974,6 +23127,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -22999,9 +23154,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -23013,22 +23168,71 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - decrement_function(zptr); + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } + } else { + SEPARATE_ZVAL_NOREF(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -23053,6 +23257,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -23076,10 +23282,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } /* here we are sure we are dealing with an object */ - + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { @@ -23090,19 +23295,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + ZVAL_COPY_VALUE(zptr, val); + } } else { - decrement_function(zptr); + zval_opt_copy_ctor(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc, EX_VAR(opline->result.var)); } } while (0); @@ -25254,6 +25508,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP 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, execute_data, &free_op1); @@ -25282,9 +25538,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -25293,13 +25549,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_DEREF(zptr); SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + binary_op(&z_copy, &z_copy, value); + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } + } else { + binary_op(zptr, zptr, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -26172,6 +26452,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -26197,9 +26479,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -26211,22 +26493,71 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - decrement_function(zptr); + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } + } else { + SEPARATE_ZVAL_NOREF(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -26252,6 +26583,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -26275,10 +26608,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } /* here we are sure we are dealing with an object */ - + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { @@ -26289,19 +26621,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - decrement_function(zptr); + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + ZVAL_COPY_VALUE(zptr, val); + } + } else { + zval_opt_copy_ctor(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } } } else { - zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc, EX_VAR(opline->result.var)); } } while (0); @@ -28381,6 +28762,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval *property; zval *value; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); @@ -28409,9 +28792,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -28420,13 +28803,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_DEREF(zptr); SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + binary_op(&z_copy, &z_copy, value); + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } + } else { + binary_op(zptr, zptr, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -29027,6 +29434,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); @@ -29052,9 +29461,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -29066,22 +29475,71 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } } else { - decrement_function(zptr); + SEPARATE_ZVAL_NOREF(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -29106,6 +29564,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); @@ -29129,10 +29589,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } /* here we are sure we are dealing with an object */ - + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { @@ -29143,19 +29602,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + ZVAL_COPY_VALUE(zptr, val); + } } else { - decrement_function(zptr); + zval_opt_copy_ctor(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc, EX_VAR(opline->result.var)); } } while (0); @@ -32119,6 +32627,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval *property; zval *value; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); @@ -32147,9 +32657,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -32158,13 +32668,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_DEREF(zptr); SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + binary_op(&z_copy, &z_copy, value); + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } + } else { + binary_op(zptr, zptr, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -32765,6 +33299,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); @@ -32790,9 +33326,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -32804,22 +33340,71 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } } else { - decrement_function(zptr); + SEPARATE_ZVAL_NOREF(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -32844,6 +33429,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); @@ -32867,10 +33454,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } /* here we are sure we are dealing with an object */ - + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { @@ -32881,19 +33467,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + ZVAL_COPY_VALUE(zptr, val); + } } else { - decrement_function(zptr); + zval_opt_copy_ctor(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc, EX_VAR(opline->result.var)); } } while (0); @@ -34740,6 +35375,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval *property; zval *value; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); @@ -34768,9 +35405,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -34779,13 +35416,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_DEREF(zptr); SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + binary_op(&z_copy, &z_copy, value); + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } + } else { + binary_op(zptr, zptr, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -35387,6 +36048,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); @@ -35412,9 +36075,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -35426,22 +36089,71 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } } else { - decrement_function(zptr); + SEPARATE_ZVAL_NOREF(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -35467,6 +36179,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); @@ -35490,10 +36204,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } /* here we are sure we are dealing with an object */ - + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { @@ -35504,19 +36217,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - decrement_function(zptr); + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + ZVAL_COPY_VALUE(zptr, val); + } + } else { + zval_opt_copy_ctor(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } } } else { - zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc, EX_VAR(opline->result.var)); } } while (0); @@ -39622,6 +40384,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval *property; zval *value; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); @@ -39650,9 +40414,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -39661,13 +40425,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_DEREF(zptr); SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + binary_op(&z_copy, &z_copy, value); + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } + } else { + binary_op(zptr, zptr, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -40538,6 +41326,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); @@ -40563,9 +41353,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -40577,22 +41367,71 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } } else { - decrement_function(zptr); + SEPARATE_ZVAL_NOREF(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -40617,6 +41456,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); @@ -40640,10 +41481,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } /* here we are sure we are dealing with an object */ - + cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { @@ -40654,19 +41494,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - decrement_function(zptr); + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + ZVAL_COPY_VALUE(zptr, val); + } + } else { + zval_opt_copy_ctor(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc, EX_VAR(opline->result.var)); } } while (0); @@ -46905,6 +47794,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval *property; zval *value; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); @@ -46933,9 +47824,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -46944,13 +47835,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_DEREF(zptr); SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + binary_op(&z_copy, &z_copy, value); + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } + } else { + binary_op(zptr, zptr, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -47821,6 +48736,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); @@ -47846,9 +48763,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -47860,22 +48777,71 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } } else { - decrement_function(zptr); + SEPARATE_ZVAL_NOREF(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -47900,6 +48866,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); @@ -47923,10 +48891,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } /* here we are sure we are dealing with an object */ - + cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { @@ -47937,19 +48904,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - decrement_function(zptr); + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + ZVAL_COPY_VALUE(zptr, val); + } + } else { + zval_opt_copy_ctor(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } } } else { - zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc, EX_VAR(opline->result.var)); } } while (0); @@ -51174,6 +52190,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval *property; zval *value; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); @@ -51202,9 +52220,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } /* here we are sure we are dealing with an object */ + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -51213,13 +52231,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_DEREF(zptr); SEPARATE_ZVAL_NOREF(zptr); - binary_op(zptr, zptr, value); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + binary_op(&z_copy, &z_copy, value); + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } + } else { + binary_op(zptr, zptr, value); + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -52092,6 +53134,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); @@ -52117,9 +53161,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } /* here we are sure we are dealing with an object */ + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -52131,22 +53175,71 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, val); + } } else { - decrement_function(zptr); + SEPARATE_ZVAL_NOREF(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } } else { - zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zend_pre_incdec_overloaded_property(object, property, cache_slot, inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); } } while (0); @@ -52172,6 +53265,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zval *object; zval *property; zval *zptr; + void **cache_slot; + zend_property_info *prop_info; SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); @@ -52195,10 +53290,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } /* here we are sure we are dealing with an object */ - + cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr) - && EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object))) - && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { + && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) { if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { @@ -52209,19 +53303,68 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { fast_long_decrement_function(zptr); } + if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); + if (inc) { + ZVAL_LONG(zptr, ZEND_LONG_MAX); + } else { + ZVAL_LONG(zptr, ZEND_LONG_MIN); + } + } + } + } } else { ZVAL_DEREF(zptr); ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + } + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy, tmp, *val; + + ZVAL_DUP(&z_copy, zptr); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zval_ptr_dtor(&z_copy); + } else { + ZVAL_COPY_VALUE(zptr, val); + } } else { - decrement_function(zptr); + zval_opt_copy_ctor(zptr); + if (inc) { + increment_function(zptr); + } else { + decrement_function(zptr); + } } } } } else { - zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var)); + zend_post_incdec_overloaded_property(object, property, cache_slot, inc, EX_VAR(opline->result.var)); } } while (0); From 865686ff459b366fe1c82b6588bce50f3478121a Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 26 May 2016 15:13:06 +0300 Subject: [PATCH 184/369] Fixed ZTS compatibility --- Zend/zend.c | 25 +++++++++++++++++++++++++ Zend/zend_execute_API.c | 22 ---------------------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index c4b91ce31aa0..77f054d54359 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -769,6 +769,28 @@ void zend_register_standard_ini_entries(void) /* {{{ */ } /* }}} */ +static void zend_resolve_property_types(void) /* {{{ */ +{ + zend_class_entry *ce; + zend_property_info *prop_info; + + ZEND_HASH_FOREACH_PTR(CG(class_table), ce) { + if (UNEXPECTED(ce->type == ZEND_INTERNAL_CLASS) + && UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { + + ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) { + if (prop_info->type == IS_OBJECT && prop_info->type_name) { + zend_class_entry *prop_ce = + zend_hash_find(CG(class_table), prop_info->type_name); + + assert(prop_ce && prop_ce->type == ZEND_INTERNAL_CLASS); + prop_info->type_ce = prop_ce; + } + }ZEND_HASH_FOREACH_END(); + } + } ZEND_HASH_FOREACH_END(); +} /* }}} */ + /* Unlink the global (r/o) copies of the class, function and constant tables, * and use a fresh r/w copy for the startup thread */ @@ -780,6 +802,8 @@ void zend_post_startup(void) /* {{{ */ zend_compiler_globals *compiler_globals = ts_resource(compiler_globals_id); zend_executor_globals *executor_globals = ts_resource(executor_globals_id); + zend_resolve_property_types(); + *GLOBAL_FUNCTION_TABLE = *compiler_globals->function_table; *GLOBAL_CLASS_TABLE = *compiler_globals->class_table; *GLOBAL_CONSTANTS_TABLE = *executor_globals->zend_constants; @@ -804,6 +828,7 @@ void zend_post_startup(void) /* {{{ */ global_persistent_list = &EG(persistent_list); zend_copy_ini_directives(); #else + zend_resolve_property_types(); virtual_cwd_deactivate(); #endif } diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index a9a82a68afc0..dba10e356468 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -114,25 +114,6 @@ ZEND_API int clean_non_persistent_function_full(zval *zv) /* {{{ */ } /* }}} */ -static int clean_non_persistent_type_info(zval *zv) /* {{{ */ -{ - zend_class_entry *ce = Z_PTR_P(zv); - - if (UNEXPECTED(ce->type == ZEND_INTERNAL_CLASS)) { - if (ZEND_CLASS_HAS_TYPE_HINTS(ce)) { - zend_property_info *prop_info; - ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) { - if (prop_info->type_ce->type == ZEND_USER_CLASS) { - prop_info->type_ce = NULL; - } - } ZEND_HASH_FOREACH_END(); - } - return ZEND_HASH_APPLY_KEEP; - } - - return ZEND_HASH_APPLY_STOP; -} /* }}} */ - static int clean_non_persistent_class(zval *zv) /* {{{ */ { zend_class_entry *ce = Z_PTR_P(zv); @@ -378,9 +359,6 @@ void shutdown_executor(void) /* {{{ */ zend_vm_stack_destroy(); - /* remove non persistent type info from internal classes */ - zend_hash_apply(EG(class_table), clean_non_persistent_type_info); - /* Destroy all op arrays */ if (EG(full_tables_cleanup)) { zend_hash_reverse_apply(EG(function_table), clean_non_persistent_function_full); From bf875fb2266037107da421510f4c293a71004ae7 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 26 May 2016 15:22:29 +0300 Subject: [PATCH 185/369] Fixed compilation warning --- Zend/zend.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend.c b/Zend/zend.c index 77f054d54359..269a0489e208 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -781,7 +781,7 @@ static void zend_resolve_property_types(void) /* {{{ */ ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) { if (prop_info->type == IS_OBJECT && prop_info->type_name) { zend_class_entry *prop_ce = - zend_hash_find(CG(class_table), prop_info->type_name); + (zend_class_entry*)zend_hash_find(CG(class_table), prop_info->type_name); assert(prop_ce && prop_ce->type == ZEND_INTERNAL_CLASS); prop_info->type_ce = prop_ce; From fc41cdca81c15a8a7cc048c4178fe03011b95de9 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 26 May 2016 15:24:03 +0300 Subject: [PATCH 186/369] fixed white-spaces --- .../typed_properties_042.phpt | 2 +- .../typed_properties_043.phpt | 2 +- .../typed_properties_051.phpt | 2 +- .../typed_properties_052.phpt | 2 +- .../typed_properties_054.phpt | 2 +- .../typed_properties_056.phpt | 2 +- .../tests/type_declarations/types_in_ast.phpt | 46 +++++++++---------- Zend/zend_execute.c | 10 ++-- Zend/zend_vm_def.h | 10 ++-- Zend/zend_vm_execute.h | 36 +++++++-------- 10 files changed, 57 insertions(+), 57 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_042.phpt b/Zend/tests/type_declarations/typed_properties_042.phpt index fdaeab6a6c11..0d1f45943aac 100644 --- a/Zend/tests/type_declarations/typed_properties_042.phpt +++ b/Zend/tests/type_declarations/typed_properties_042.phpt @@ -22,4 +22,4 @@ int(5) int(5) int(5) int(5) -int(5) \ No newline at end of file +int(5) diff --git a/Zend/tests/type_declarations/typed_properties_043.phpt b/Zend/tests/type_declarations/typed_properties_043.phpt index ef07d1aef353..cd4e680ef641 100644 --- a/Zend/tests/type_declarations/typed_properties_043.phpt +++ b/Zend/tests/type_declarations/typed_properties_043.phpt @@ -21,4 +21,4 @@ int(5) int(5) int(5) int(5) -int(5) \ No newline at end of file +int(5) diff --git a/Zend/tests/type_declarations/typed_properties_051.phpt b/Zend/tests/type_declarations/typed_properties_051.phpt index 1556eabe49ce..1c8673d0d3d4 100644 --- a/Zend/tests/type_declarations/typed_properties_051.phpt +++ b/Zend/tests/type_declarations/typed_properties_051.phpt @@ -3,7 +3,7 @@ Weak casts must not leak --FILE-- --EXPECTF-- -Fatal error: Default value for properties with callable type can only be a string or an array in %styped_properties_054.php on line 3 \ No newline at end of file +Fatal error: Default value for properties with callable type can only be a string or an array in %styped_properties_054.php on line 3 diff --git a/Zend/tests/type_declarations/typed_properties_056.phpt b/Zend/tests/type_declarations/typed_properties_056.phpt index e6d6e6338e1e..4fc7b014b2a9 100644 --- a/Zend/tests/type_declarations/typed_properties_056.phpt +++ b/Zend/tests/type_declarations/typed_properties_056.phpt @@ -20,4 +20,4 @@ unset($o); ?> --EXPECT-- Typed property A::$foo must be string, integer used -string(3) "100" \ No newline at end of file +string(3) "100" diff --git a/Zend/tests/type_declarations/types_in_ast.phpt b/Zend/tests/type_declarations/types_in_ast.phpt index 8958735dbba1..61268fdf91f3 100644 --- a/Zend/tests/type_declarations/types_in_ast.phpt +++ b/Zend/tests/type_declarations/types_in_ast.phpt @@ -1,23 +1,23 @@ ---TEST-- -AST pretty-peinter ---INI-- -zend.assertions=1 -assert.exception=0 ---FILE-- - ---EXPECTF-- -Warning: assert(): assert(0 && ($a = function (int $a, ?int $b, int $c = null): ?int { - $x = new class { - public $a; - public int $b; - public ?int $c; - }; -})) failed in %stypes_in_ast.php on line 2 +--TEST-- +AST pretty-peinter +--INI-- +zend.assertions=1 +assert.exception=0 +--FILE-- + +--EXPECTF-- +Warning: assert(): assert(0 && ($a = function (int $a, ?int $b, int $c = null): ?int { + $x = new class { + public $a; + public int $b; + public ?int $c; + }; +})) failed in %stypes_in_ast.php on line 2 diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index a4a800adbb5a..8dc573ae5d02 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1536,13 +1536,13 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, } ZVAL_COPY_VALUE(z, value); } - + if (EXPECTED(cache_slot)) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_get_property_info(Z_OBJCE(obj), Z_STR_P(property), 1); } - + if (EXPECTED(prop_info) && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) && UNEXPECTED(prop_info->type)) { @@ -1561,7 +1561,7 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot); OBJ_RELEASE(Z_OBJ(obj)); zval_ptr_dtor(&z_copy); - return; + return; } ZVAL_DEREF(z); @@ -1615,7 +1615,7 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z } else { prop_info = zend_get_property_info(Z_OBJCE(obj), Z_STR_P(property), 1); } - + if (EXPECTED(prop_info) && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) && UNEXPECTED(prop_info->type)) { @@ -1630,7 +1630,7 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z } zval_ptr_dtor(&z_copy); OBJ_RELEASE(Z_OBJ(obj)); - return; + return; } zptr = z; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d7fc6f603e88..8c78af0a226e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1222,7 +1222,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) && UNEXPECTED(prop_info->type)) { zval tmp, *val; - + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); @@ -1231,12 +1231,12 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { ZVAL_DEREF(zptr); - + if (OP2_TYPE == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { @@ -1350,7 +1350,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) && UNEXPECTED(prop_info->type)) { zval tmp, *val; - + val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); @@ -1359,7 +1359,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index e7b5177d7f23..baf6b35b5f99 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17963,7 +17963,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { @@ -18090,7 +18090,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { @@ -23187,7 +23187,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { @@ -23314,7 +23314,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { @@ -26512,7 +26512,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { @@ -26640,7 +26640,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { @@ -29494,7 +29494,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { @@ -29621,7 +29621,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { @@ -33359,7 +33359,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { @@ -33486,7 +33486,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { @@ -36108,7 +36108,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { @@ -36236,7 +36236,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { @@ -41386,7 +41386,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { @@ -41513,7 +41513,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { @@ -48796,7 +48796,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { @@ -48923,7 +48923,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { @@ -53194,7 +53194,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { @@ -53322,7 +53322,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { ZVAL_LONG(zptr, ZEND_LONG_MIN); } - } + } } } } else { From 8beea3d96f2801a8923b02a0560ac7a5f7170e1d Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 26 May 2016 15:48:41 +0300 Subject: [PATCH 187/369] Optimization --- Zend/zend_execute.c | 19 +-- Zend/zend_execute.h | 4 +- Zend/zend_vm_def.h | 30 ++--- Zend/zend_vm_execute.h | 270 ++++++++++++++--------------------------- 4 files changed, 109 insertions(+), 214 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 8dc573ae5d02..136b905b6333 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1540,12 +1540,10 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, if (EXPECTED(cache_slot)) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE(obj), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE(obj), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy; @@ -1613,12 +1611,10 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z if (EXPECTED(cache_slot)) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE(obj), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE(obj), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy; @@ -2145,12 +2141,9 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (prop_op_type == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(container), Z_STR_P(prop_ptr), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(prop_ptr), NULL); } - if (EXPECTED(prop_info) - && (prop_op_type == IS_CONST - || UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zend_throw_exception_ex( zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be referenced", diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index f670eeb78da3..c8a14ac2c61e 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -381,7 +381,9 @@ static zend_always_inline zend_property_info* zend_object_fetch_property_type_in info = zend_get_property_info(Z_OBJCE_P(object), property, 1); - if (UNEXPECTED(info && info != ZEND_WRONG_PROPERTY_INFO && info->type)) { + if (EXPECTED(info) + && UNEXPECTED(info != ZEND_WRONG_PROPERTY_INFO) + && UNEXPECTED(info->type)) { return info; } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 8c78af0a226e..89c080cdaf51 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -751,11 +751,9 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, if (OP2_TYPE == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)){ /* special case for typed properties */ zval z_copy, tmp, *val; @@ -1216,11 +1214,9 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, if (OP2_TYPE == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -1240,11 +1236,9 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, if (OP2_TYPE == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -1344,11 +1338,9 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, if (OP2_TYPE == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -1369,11 +1361,9 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, if (OP2_TYPE == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index baf6b35b5f99..0dfe79f5d9ae 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17005,11 +17005,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)){ /* special case for typed properties */ zval z_copy, tmp, *val; @@ -17948,11 +17946,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -17972,11 +17968,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -18075,11 +18069,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -18100,11 +18092,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -22229,11 +22219,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)){ /* special case for typed properties */ zval z_copy, tmp, *val; @@ -23172,11 +23160,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -23196,11 +23182,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -23299,11 +23283,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -23324,11 +23306,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -25552,11 +25532,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)){ /* special case for typed properties */ zval z_copy, tmp, *val; @@ -26497,11 +26475,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -26521,11 +26497,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -26625,11 +26599,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -26650,11 +26622,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -28806,11 +28776,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)){ /* special case for typed properties */ zval z_copy, tmp, *val; @@ -29479,11 +29447,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -29503,11 +29469,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -29606,11 +29570,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -29631,11 +29593,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -32671,11 +32631,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)){ /* special case for typed properties */ zval z_copy, tmp, *val; @@ -33344,11 +33302,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -33368,11 +33324,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -33471,11 +33425,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -33496,11 +33448,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -35419,11 +35369,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)){ /* special case for typed properties */ zval z_copy, tmp, *val; @@ -36093,11 +36041,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -36117,11 +36063,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -36221,11 +36165,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -36246,11 +36188,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -40428,11 +40368,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)){ /* special case for typed properties */ zval z_copy, tmp, *val; @@ -41371,11 +41309,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -41395,11 +41331,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -41498,11 +41432,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -41523,11 +41455,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -47838,11 +47768,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)){ /* special case for typed properties */ zval z_copy, tmp, *val; @@ -48781,11 +48709,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -48805,11 +48731,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -48908,11 +48832,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -48933,11 +48855,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -52234,11 +52154,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)){ /* special case for typed properties */ zval z_copy, tmp, *val; @@ -53179,11 +53097,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -53203,11 +53119,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; @@ -53307,11 +53221,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); @@ -53332,11 +53244,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(property), 1); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (EXPECTED(prop_info) - && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) - && UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info)) { /* special case for typed properties */ zval z_copy, tmp, *val; From 13c86d9adcb7437f904efeb7cc3f37b7fac38fed Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 26 May 2016 16:24:30 +0300 Subject: [PATCH 188/369] Cleanup ext/reflection changes --- ext/reflection/php_reflection.c | 70 +++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 3150c7d95157..6fc340f44843 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -1275,8 +1275,8 @@ static void reflection_parameter_factory(zend_function *fptr, zval *closure_obje } /* }}} */ -/* {{{ reflection_type_factory */ -static void reflection_type_factory(void *scope, zval *closure_object, void *info, reflection_info_type_t type, zval *object) +/* {{{ reflection_arg_type_factory */ +static void reflection_arg_type_factory(zend_function *fptr, zval *closure_object, struct _zend_arg_info *arg_info, zval *object) { reflection_object *intern; type_reference *reference; @@ -1284,26 +1284,35 @@ static void reflection_type_factory(void *scope, zval *closure_object, void *inf reflection_instantiate(reflection_type_ptr, object); intern = Z_REFLECTION_P(object); reference = (type_reference*) emalloc(sizeof(type_reference)); - reference->type = type; + reference->type = REF_INFO_ARG; + reference->info.arg = arg_info; + reference->scope.fptr = fptr; intern->ptr = reference; intern->ref_type = REF_TYPE_TYPE; + intern->ce = fptr->common.scope; - switch (type) { - case REF_INFO_ARG: { - zend_function *fptr = (zend_function*) scope; - - reference->scope.fptr = fptr; - intern->ce = fptr->common.scope; + if (closure_object) { + Z_ADDREF_P(closure_object); + ZVAL_COPY_VALUE(&intern->obj, closure_object); + } +} +/* }}} */ - reference->info.arg = info; - } break; +/* {{{ reflection_prop_type_factory */ +static void reflection_prop_type_factory(zend_class_entry *ce, zval *closure_object, zend_property_info *prop_info, zval *object) +{ + reflection_object *intern; + type_reference *reference; - case REF_INFO_PROP: - reference->scope.ce = scope; - intern->ce = scope; - reference->info.prop = info; - break; - } + reflection_instantiate(reflection_type_ptr, object); + intern = Z_REFLECTION_P(object); + reference = (type_reference*) emalloc(sizeof(type_reference)); + reference->type = REF_INFO_PROP; + reference->info.prop = prop_info; + reference->scope.ce = ce; + intern->ptr = reference; + intern->ref_type = REF_TYPE_TYPE; + intern->ce = ce; if (closure_object) { Z_ADDREF_P(closure_object); @@ -2754,7 +2763,7 @@ ZEND_METHOD(reflection_parameter, getType) { RETURN_NULL(); } - reflection_type_factory(_copy_function(param->fptr), Z_ISUNDEF(intern->obj)? NULL : &intern->obj, param->arg_info, REF_INFO_ARG, return_value); + reflection_arg_type_factory(_copy_function(param->fptr), Z_ISUNDEF(intern->obj)? NULL : &intern->obj, param->arg_info, return_value); } /* }}} */ @@ -3006,7 +3015,7 @@ ZEND_METHOD(reflection_type, allowsNull) RETVAL_BOOL(param->info.arg->allow_null); break; case REF_INFO_PROP: - RETVAL_FALSE; + RETVAL_BOOL(param->info.prop->allow_null); break; } } @@ -3025,13 +3034,12 @@ ZEND_METHOD(reflection_type, isBuiltin) GET_REFLECTION_OBJECT_PTR(param); switch (param->type) { - case REF_INFO_ARG: { + case REF_INFO_ARG: RETVAL_BOOL(param->info.arg->type_hint != IS_OBJECT); - } break; - + break; case REF_INFO_PROP: RETVAL_BOOL(param->info.prop->type != IS_OBJECT); - break; + break; } } /* }}} */ @@ -3051,7 +3059,7 @@ ZEND_METHOD(reflection_type, __toString) GET_REFLECTION_OBJECT_PTR(param); switch (param->type) { - case REF_INFO_ARG: { + case REF_INFO_ARG: type = param->info.arg->type_hint; if (type == IS_OBJECT) { zend_function *fptr = param->scope.fptr; @@ -3059,16 +3067,18 @@ ZEND_METHOD(reflection_type, __toString) if (fptr->type == ZEND_INTERNAL_FUNCTION && !(fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO)) { RETURN_STRING(((zend_internal_arg_info*) param->info.arg)->class_name); - } else RETURN_STR_COPY(param->info.arg->class_name); + } else { + RETURN_STR_COPY(param->info.arg->class_name); + } } - } break; + break; - case REF_INFO_PROP: { + case REF_INFO_PROP: type = param->info.prop->type; if (type == IS_OBJECT) { RETURN_STR_COPY(param->info.prop->type_name); } - } break; + break; } switch (type) { @@ -3624,7 +3634,7 @@ ZEND_METHOD(reflection_function, getReturnType) RETURN_NULL(); } - reflection_type_factory(_copy_function(fptr), Z_ISUNDEF(intern->obj)? NULL : &intern->obj, &fptr->common.arg_info[-1], REF_INFO_ARG, return_value); + reflection_arg_type_factory(_copy_function(fptr), Z_ISUNDEF(intern->obj)? NULL : &intern->obj, &fptr->common.arg_info[-1], return_value); } /* }}} */ @@ -5882,7 +5892,7 @@ ZEND_METHOD(reflection_property, getType) RETURN_NULL(); } - reflection_type_factory(ref->prop.ce, Z_ISUNDEF(intern->obj) ? NULL : &intern->obj, &ref->prop, REF_INFO_PROP, return_value); + reflection_prop_type_factory(ref->prop.ce, Z_ISUNDEF(intern->obj) ? NULL : &intern->obj, &ref->prop, return_value); } /* }}} */ From 697b1b120f1c44344df707bd45ab555a961b75de Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 26 May 2016 16:56:57 +0300 Subject: [PATCH 189/369] Moved BG(unserialize_refs) into php_unserialize_data_t --- ext/standard/basic_functions.c | 4 -- ext/standard/basic_functions.h | 1 - ext/standard/php_var.h | 1 + ext/standard/var.c | 2 - ext/standard/var_unserializer.c | 72 ++++++++++++++++++-------------- ext/standard/var_unserializer.re | 10 ++++- 6 files changed, 50 insertions(+), 40 deletions(-) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 47d067794983..f887903f268e 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -3742,8 +3742,6 @@ PHP_RINIT_FUNCTION(basic) /* {{{ */ #endif BG(user_shutdown_function_names) = NULL; - zend_hash_init(&BG(unserialize_refs), 8, NULL, ZVAL_PTR_DTOR, 0); - PHP_RINIT(filestat)(INIT_FUNC_ARGS_PASSTHRU); #ifdef HAVE_SYSLOG_H BASIC_RINIT_SUBMODULE(syslog) @@ -3773,8 +3771,6 @@ PHP_RSHUTDOWN_FUNCTION(basic) /* {{{ */ zend_hash_destroy(&BG(putenv_ht)); #endif - zend_hash_destroy(&BG(unserialize_refs)); - if (BG(umask) != -1) { umask(BG(umask)); } diff --git a/ext/standard/basic_functions.h b/ext/standard/basic_functions.h index 674f2aadc3ec..e37bca31d6dd 100644 --- a/ext/standard/basic_functions.h +++ b/ext/standard/basic_functions.h @@ -208,7 +208,6 @@ typedef struct _php_basic_globals { struct php_unserialize_data *data; unsigned level; } unserialize; - HashTable unserialize_refs; /* url_scanner_ex.re */ url_adapt_state_ex_t url_adapt_state_ex; diff --git a/ext/standard/php_var.h b/ext/standard/php_var.h index 4afefbe95aef..7185767d1b2f 100644 --- a/ext/standard/php_var.h +++ b/ext/standard/php_var.h @@ -48,6 +48,7 @@ struct php_unserialize_data { void *last; void *first_dtor; void *last_dtor; + HashTable *refs; }; typedef struct php_serialize_data *php_serialize_data_t; diff --git a/ext/standard/var.c b/ext/standard/var.c index 614c35a3638d..47339161747b 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -1126,7 +1126,6 @@ PHP_FUNCTION(unserialize) zend_hash_destroy(class_hash); FREE_HASHTABLE(class_hash); } - zend_hash_clean(&BG(unserialize_refs)); zval_ptr_dtor(return_value); if (!EG(exception)) { php_error_docref(NULL, E_NOTICE, "Error at offset " ZEND_LONG_FMT " of %zd bytes", @@ -1148,7 +1147,6 @@ PHP_FUNCTION(unserialize) zend_hash_destroy(class_hash); FREE_HASHTABLE(class_hash); } - zend_hash_clean(&BG(unserialize_refs)); } /* }}} */ diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c index 7879d977b6ce..edb122ab2711 100644 --- a/ext/standard/var_unserializer.c +++ b/ext/standard/var_unserializer.c @@ -164,6 +164,10 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx) efree_size(var_dtor_hash, sizeof(var_dtor_entries)); var_dtor_hash = next; } + + if ((*var_hashx)->refs) { + zend_array_destroy((*var_hashx)->refs); + } } /* }}} */ @@ -238,7 +242,7 @@ static inline int unserialize_allowed_class(zend_string *class_name, HashTable * #define YYMARKER marker -#line 246 "ext/standard/var_unserializer.re" +#line 250 "ext/standard/var_unserializer.re" @@ -374,7 +378,11 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab data = old_data; } else { /* little hack to disallow references */ - data = zend_hash_next_index_insert(&BG(unserialize_refs), &d); + if (!(*var_hash)->refs) { + (*var_hash)->refs = emalloc(sizeof(HashTable)); + zend_hash_init((*var_hash)->refs, 8, NULL, ZVAL_PTR_DTOR, 0); + } + data = zend_hash_next_index_insert((*var_hash)->refs, &d); } } else { var_push_dtor(var_hash, old_data); @@ -551,7 +559,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) start = cursor; -#line 555 "ext/standard/var_unserializer.c" +#line 563 "ext/standard/var_unserializer.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -611,9 +619,9 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *(YYMARKER = ++YYCURSOR); if (yych == ':') goto yy95; yy3: -#line 921 "ext/standard/var_unserializer.re" +#line 929 "ext/standard/var_unserializer.re" { return 0; } -#line 617 "ext/standard/var_unserializer.c" +#line 625 "ext/standard/var_unserializer.c" yy4: yych = *(YYMARKER = ++YYCURSOR); if (yych == ':') goto yy89; @@ -656,13 +664,13 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) goto yy3; yy14: ++YYCURSOR; -#line 915 "ext/standard/var_unserializer.re" +#line 923 "ext/standard/var_unserializer.re" { /* this is the case where we have less data than planned */ php_error_docref(NULL, E_NOTICE, "Unexpected end of serialized data"); return 0; /* not sure if it should be 0 or 1 here? */ } -#line 666 "ext/standard/var_unserializer.c" +#line 674 "ext/standard/var_unserializer.c" yy16: yych = *++YYCURSOR; goto yy3; @@ -692,7 +700,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 770 "ext/standard/var_unserializer.re" +#line 778 "ext/standard/var_unserializer.re" { size_t len, len2, len3, maxlen; zend_long elements; @@ -837,7 +845,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) return object_common2(UNSERIALIZE_PASSTHRU, elements); } -#line 841 "ext/standard/var_unserializer.c" +#line 849 "ext/standard/var_unserializer.c" yy25: yych = *++YYCURSOR; if (yych <= ',') { @@ -862,14 +870,14 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 763 "ext/standard/var_unserializer.re" +#line 771 "ext/standard/var_unserializer.re" { if (!var_hash) return 0; return object_common2(UNSERIALIZE_PASSTHRU, object_common1(UNSERIALIZE_PASSTHRU, ZEND_STANDARD_CLASS_DEF_PTR)); } -#line 873 "ext/standard/var_unserializer.c" +#line 881 "ext/standard/var_unserializer.c" yy32: yych = *++YYCURSOR; if (yych == '+') goto yy33; @@ -890,7 +898,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != '{') goto yy18; ++YYCURSOR; -#line 739 "ext/standard/var_unserializer.re" +#line 747 "ext/standard/var_unserializer.re" { zend_long elements = parse_iv(start + 2); /* use iv() not uiv() in order to check data range */ @@ -914,7 +922,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) return finish_nested_data(UNSERIALIZE_PASSTHRU); } -#line 918 "ext/standard/var_unserializer.c" +#line 926 "ext/standard/var_unserializer.c" yy39: yych = *++YYCURSOR; if (yych == '+') goto yy40; @@ -935,7 +943,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 705 "ext/standard/var_unserializer.re" +#line 713 "ext/standard/var_unserializer.re" { size_t len, maxlen; zend_string *str; @@ -969,7 +977,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) ZVAL_STR(rval, str); return 1; } -#line 973 "ext/standard/var_unserializer.c" +#line 981 "ext/standard/var_unserializer.c" yy46: yych = *++YYCURSOR; if (yych == '+') goto yy47; @@ -990,7 +998,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 673 "ext/standard/var_unserializer.re" +#line 681 "ext/standard/var_unserializer.re" { size_t len, maxlen; char *str; @@ -1022,7 +1030,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) ZVAL_STRINGL(rval, str, len); return 1; } -#line 1026 "ext/standard/var_unserializer.c" +#line 1034 "ext/standard/var_unserializer.c" yy53: yych = *++YYCURSOR; if (yych <= '/') { @@ -1110,7 +1118,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) } yy63: ++YYCURSOR; -#line 664 "ext/standard/var_unserializer.re" +#line 672 "ext/standard/var_unserializer.re" { #if SIZEOF_ZEND_LONG == 4 use_double: @@ -1119,7 +1127,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) ZVAL_DOUBLE(rval, zend_strtod((const char *)start + 2, NULL)); return 1; } -#line 1123 "ext/standard/var_unserializer.c" +#line 1131 "ext/standard/var_unserializer.c" yy65: yych = *++YYCURSOR; if (yych <= ',') { @@ -1178,7 +1186,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != ';') goto yy18; ++YYCURSOR; -#line 648 "ext/standard/var_unserializer.re" +#line 656 "ext/standard/var_unserializer.re" { *p = YYCURSOR; @@ -1194,7 +1202,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) return 1; } -#line 1198 "ext/standard/var_unserializer.c" +#line 1206 "ext/standard/var_unserializer.c" yy76: yych = *++YYCURSOR; if (yych == 'N') goto yy73; @@ -1221,7 +1229,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) if (yych <= '9') goto yy79; if (yych != ';') goto yy18; ++YYCURSOR; -#line 622 "ext/standard/var_unserializer.re" +#line 630 "ext/standard/var_unserializer.re" { #if SIZEOF_ZEND_LONG == 4 int digits = YYCURSOR - start - 3; @@ -1247,7 +1255,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) ZVAL_LONG(rval, parse_iv(start + 2)); return 1; } -#line 1251 "ext/standard/var_unserializer.c" +#line 1259 "ext/standard/var_unserializer.c" yy83: yych = *++YYCURSOR; if (yych <= '/') goto yy18; @@ -1255,22 +1263,22 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) yych = *++YYCURSOR; if (yych != ';') goto yy18; ++YYCURSOR; -#line 616 "ext/standard/var_unserializer.re" +#line 624 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_BOOL(rval, parse_iv(start + 2)); return 1; } -#line 1265 "ext/standard/var_unserializer.c" +#line 1273 "ext/standard/var_unserializer.c" yy87: ++YYCURSOR; -#line 610 "ext/standard/var_unserializer.re" +#line 618 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_NULL(rval); return 1; } -#line 1274 "ext/standard/var_unserializer.c" +#line 1282 "ext/standard/var_unserializer.c" yy89: yych = *++YYCURSOR; if (yych <= ',') { @@ -1293,7 +1301,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) if (yych <= '9') goto yy91; if (yych != ';') goto yy18; ++YYCURSOR; -#line 585 "ext/standard/var_unserializer.re" +#line 593 "ext/standard/var_unserializer.re" { zend_long id; @@ -1318,7 +1326,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) return 1; } -#line 1322 "ext/standard/var_unserializer.c" +#line 1330 "ext/standard/var_unserializer.c" yy95: yych = *++YYCURSOR; if (yych <= ',') { @@ -1341,7 +1349,7 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) if (yych <= '9') goto yy97; if (yych != ';') goto yy18; ++YYCURSOR; -#line 559 "ext/standard/var_unserializer.re" +#line 567 "ext/standard/var_unserializer.re" { zend_long id; @@ -1367,9 +1375,9 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER) return 1; } -#line 1371 "ext/standard/var_unserializer.c" +#line 1379 "ext/standard/var_unserializer.c" } -#line 923 "ext/standard/var_unserializer.re" +#line 931 "ext/standard/var_unserializer.re" return 0; diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 8cd6b40a1bf5..d65ddb948e8f 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -162,6 +162,10 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx) efree_size(var_dtor_hash, sizeof(var_dtor_entries)); var_dtor_hash = next; } + + if ((*var_hashx)->refs) { + zend_array_destroy((*var_hashx)->refs); + } } /* }}} */ @@ -378,7 +382,11 @@ string_key: data = old_data; } else { /* little hack to disallow references */ - data = zend_hash_next_index_insert(&BG(unserialize_refs), &d); + if (!(*var_hash)->refs) { + (*var_hash)->refs = emalloc(sizeof(HashTable)); + zend_hash_init((*var_hash)->refs, 8, NULL, ZVAL_PTR_DTOR, 0); + } + data = zend_hash_next_index_insert((*var_hash)->refs, &d); } } else { var_push_dtor(var_hash, old_data); From c5e45ff0eb73e908f87734c85299b771f1243842 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 26 May 2016 17:38:32 +0300 Subject: [PATCH 190/369] Keep GCC from incorrect over-optimisation --- Zend/zend_operators.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index 405ca0926f5c..370502282df0 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -456,7 +456,7 @@ static zend_always_inline void fast_long_increment_function(zval *op1) : "r"(&op1->value), "n"(IS_DOUBLE), "n"(ZVAL_OFFSETOF_TYPE) - : "cc"); + : "cc", "memory"); #elif defined(__GNUC__) && defined(__x86_64__) __asm__( "incq (%0)\n\t" @@ -469,7 +469,7 @@ static zend_always_inline void fast_long_increment_function(zval *op1) : "r"(&op1->value), "n"(IS_DOUBLE), "n"(ZVAL_OFFSETOF_TYPE) - : "cc"); + : "cc", "memory"); #else if (UNEXPECTED(Z_LVAL_P(op1) == ZEND_LONG_MAX)) { /* switch to double */ @@ -494,7 +494,7 @@ static zend_always_inline void fast_long_decrement_function(zval *op1) : "r"(&op1->value), "n"(IS_DOUBLE), "n"(ZVAL_OFFSETOF_TYPE) - : "cc"); + : "cc", "memory"); #elif defined(__GNUC__) && defined(__x86_64__) __asm__( "decq (%0)\n\t" @@ -507,7 +507,7 @@ static zend_always_inline void fast_long_decrement_function(zval *op1) : "r"(&op1->value), "n"(IS_DOUBLE), "n"(ZVAL_OFFSETOF_TYPE) - : "cc"); + : "cc", "memory"); #else if (UNEXPECTED(Z_LVAL_P(op1) == ZEND_LONG_MIN)) { /* switch to double */ @@ -542,7 +542,7 @@ static zend_always_inline void fast_long_add_function(zval *result, zval *op1, z "n"(IS_LONG), "n"(IS_DOUBLE), "n"(ZVAL_OFFSETOF_TYPE) - : "eax","cc"); + : "eax","cc", "memory"); #elif defined(__GNUC__) && defined(__x86_64__) __asm__( "movq (%1), %%rax\n\t" @@ -565,7 +565,7 @@ static zend_always_inline void fast_long_add_function(zval *result, zval *op1, z "n"(IS_LONG), "n"(IS_DOUBLE), "n"(ZVAL_OFFSETOF_TYPE) - : "rax","cc"); + : "rax","cc", "memory"); #else /* * 'result' may alias with op1 or op2, so we need to @@ -632,7 +632,7 @@ static zend_always_inline void fast_long_sub_function(zval *result, zval *op1, z "n"(IS_LONG), "n"(IS_DOUBLE), "n"(ZVAL_OFFSETOF_TYPE) - : "eax","cc"); + : "eax","cc", "memory"); #elif defined(__GNUC__) && defined(__x86_64__) __asm__( "movq (%1), %%rax\n\t" @@ -659,7 +659,7 @@ static zend_always_inline void fast_long_sub_function(zval *result, zval *op1, z "n"(IS_LONG), "n"(IS_DOUBLE), "n"(ZVAL_OFFSETOF_TYPE) - : "rax","cc"); + : "rax","cc", "memory"); #else ZVAL_LONG(result, Z_LVAL_P(op1) - Z_LVAL_P(op2)); From 6bb1fa9b94fdcd563ed1d11af079051ea3a61023 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 27 May 2016 12:32:33 +0300 Subject: [PATCH 191/369] Removed useles code (default value should be already properly set in trait property) --- .../typed_properties_059.phpt | 29 +++++++++++++++++++ Zend/zend_inheritance.c | 3 -- 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_059.phpt 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 000000000000..e0c6d4d5ad27 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_059.phpt @@ -0,0 +1,29 @@ +--TEST-- +Nullable typed properties in traits +--FILE-- + +--EXPECT-- +object(A)#1 (2) { + ["a2"]=> + uninitialized(integer) + ["b2"]=> + NULL + ["a1"]=> + uninitialized(integer) + ["b1"]=> + NULL +} diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 5ebf38b73fe8..da2343138ff2 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -1678,9 +1678,6 @@ static void zend_do_traits_property_binding(zend_class_entry *ce) /* {{{ */ doc_comment = property_info->doc_comment ? zend_string_copy(property_info->doc_comment) : NULL; if (property_info->type) { - if (Z_TYPE_P(prop_value) == IS_NULL) { - ZVAL_UNDEF(prop_value); - } zend_declare_typed_property(ce, prop_name, prop_value, flags, doc_comment, property_info->type, property_info->type_name, property_info->allow_null); } else { zend_declare_property_ex(ce, prop_name, prop_value, flags, doc_comment); From 5811e86f02026be862e758f02772dd2870f0a6d5 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 27 May 2016 12:35:24 +0300 Subject: [PATCH 192/369] Don't mess NULL and UNDEF default value back and force. Set proper value in first place. --- Zend/zend_API.c | 4 ---- Zend/zend_compile.c | 2 ++ 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 379f8c4705b7..289b1b31b3bc 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3655,10 +3655,6 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name } } - if (Z_ISUNDEF_P(property) && (!optional_type || allow_null)) { - ZVAL_NULL(property); - } - if (!(access_type & ZEND_ACC_PPP_MASK)) { access_type |= ZEND_ACC_PUBLIC; } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 3505b185bd73..b730d77b81a4 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5615,6 +5615,8 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ zend_get_type_by_const(optional_type)); } } + } else if (!optional_type || allow_null) { + ZVAL_NULL(&value_zv); } else { ZVAL_UNDEF(&value_zv); } From 037da58946e8ea19a95c711f33fa9d7d4e79c75a Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 27 May 2016 13:10:51 +0300 Subject: [PATCH 193/369] Remove duplicate checks --- Zend/zend_execute.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 136b905b6333..6fa5e7bd141b 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1537,11 +1537,7 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, ZVAL_COPY_VALUE(z, value); } - if (EXPECTED(cache_slot)) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE(obj), Z_STR_P(property), NULL); - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE(obj), Z_STR_P(property), NULL); if (UNEXPECTED(prop_info)) { /* special case for typed properties */ @@ -1608,11 +1604,7 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z ZVAL_COPY_VALUE(z, value); } - if (EXPECTED(cache_slot)) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE(obj), Z_STR_P(property), NULL); - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE(obj), Z_STR_P(property), NULL); if (UNEXPECTED(prop_info)) { /* special case for typed properties */ From 03e7112bf477ae2a439ef02aa2120eba80500a9c Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 27 May 2016 13:24:52 +0300 Subject: [PATCH 194/369] Fixed incorrect argument types --- Zend/zend_execute.h | 6 +++--- Zend/zend_object_handlers.c | 8 ++++---- ext/standard/var.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index c8a14ac2c61e..9aea0bd570c0 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -366,7 +366,7 @@ void zend_cleanup_unfinished_execution(zend_execute_data *execute_data, uint32_t #define ZEND_CLASS_HAS_TYPE_HINTS(ce) ((ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) == ZEND_ACC_HAS_TYPE_HINTS) -static zend_always_inline zend_property_info* zend_object_fetch_property_type_info(zval *object, zend_string *property, void **cache_slot) +static zend_always_inline zend_property_info* zend_object_fetch_property_type_info(zend_class_entry *ce, zend_string *property, void **cache_slot) { zend_property_info *info; @@ -375,11 +375,11 @@ static zend_always_inline zend_property_info* zend_object_fetch_property_type_in return (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); } - if (EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(object)))) { + if (EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(ce))) { return NULL; } - info = zend_get_property_info(Z_OBJCE_P(object), property, 1); + info = zend_get_property_info(ce, property, 1); if (EXPECTED(info) && UNEXPECTED(info != ZEND_WRONG_PROPERTY_INFO) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 898b4ec39833..3639a9de5e0f 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -676,7 +676,7 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ zval_ptr_dtor(&tmp_object); if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) && - (prop_info = zend_object_fetch_property_type_info(object, Z_STR_P(member), cache_slot)))) { + (prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot)))) { zval tmp, *val; val = zend_verify_property_type(prop_info, retval, &tmp, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES) != 0); @@ -694,7 +694,7 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ } } if ((type != BP_VAR_IS)) { - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(object, Z_STR_P(member), cache_slot)) + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot)) && UNEXPECTED(!prop_info->allow_null)) { zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", @@ -737,7 +737,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) { variable_ptr = OBJ_PROP(zobj, property_offset); if (Z_TYPE_P(variable_ptr) != IS_UNDEF) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(object, Z_STR_P(member), cache_slot); + zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot); zval tmp, *val; if (UNEXPECTED(prop_info)) { @@ -806,7 +806,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v zend_property_info *prop_info; zval tmp, *val; - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(object, Z_STR_P(member), cache_slot))) { + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot))) { val = zend_verify_property_type(prop_info, value, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(member), value); diff --git a/ext/standard/var.c b/ext/standard/var.c index 47339161747b..e46c7db4847f 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -178,7 +178,7 @@ PHPAPI void php_var_dump(zval *struc, int level) /* {{{ */ } if (key) { - prop_info = zend_object_fetch_property_type_info(struc, key, NULL); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(struc), key, NULL); } if (!Z_ISUNDEF_P(val) || prop_info) { @@ -369,7 +369,7 @@ PHPAPI void php_debug_zval_dump(zval *struc, int level) /* {{{ */ } if (key) { - prop_info = zend_object_fetch_property_type_info(struc, key, NULL); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(struc), key, NULL); } if (!Z_ISUNDEF_P(val) || prop_info) { From cc19dc51dc83b184b580da6a3421b8fbaa0022ba Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 28 May 2016 18:39:33 +0200 Subject: [PATCH 195/369] Remove bad checks for simple property inheritance --- .../typed_properties_060.phpt | 23 +++++++++++++++++++ Zend/zend_inheritance.c | 20 ---------------- 2 files changed, 23 insertions(+), 20 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_060.phpt 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 000000000000..b1d16bd3c6be --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_060.phpt @@ -0,0 +1,23 @@ +--TEST-- +Test typed properties work fine with simple inheritance +--FILE-- +a); +$o->a = "a"; + +?> +--EXPECTF-- +int(1) + +Fatal error: Uncaught TypeError: Typed property A::$a must be integer, string used in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d + diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index da2343138ff2..0b82707668c6 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -741,26 +741,6 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke } } } else { - if (UNEXPECTED(parent_info->type && !(parent_info->flags & ZEND_ACC_PRIVATE))) { - if (parent_info->type == IS_OBJECT) { - zend_error_noreturn(E_COMPILE_ERROR, - "Type of %s::$%s must be %s%s (as in class %s)", - ZSTR_VAL(ce->name), - ZSTR_VAL(key), - parent_info->allow_null ? "?" : "", - ZSTR_VAL(zend_resolve_property_type(parent_info->type_name, parent_info->ce)), - ZSTR_VAL(ce->parent->name)); - } else { - zend_error_noreturn(E_COMPILE_ERROR, - "Type of %s::$%s must be %s%s (as in class %s)", - ZSTR_VAL(ce->name), - ZSTR_VAL(key), - parent_info->allow_null ? "?" : "", - zend_get_type_by_const(parent_info->type), - ZSTR_VAL(ce->parent->name)); - } - } - if (UNEXPECTED(parent_info->flags & (ZEND_ACC_PRIVATE|ZEND_ACC_SHADOW))) { if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) { child_info = zend_duplicate_property_info_internal(parent_info); From de84f5082a2da6944726e2f7cb3ba73b7f568021 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 7 Jun 2016 07:09:21 +0100 Subject: [PATCH 196/369] changes prompted by review --- .../typed_properties_053.phpt | 14 +++----------- .../typed_properties_054.phpt | 2 +- Zend/zend.c | 4 +++- Zend/zend_ast.c | 2 +- Zend/zend_compile.c | 19 ++++++++----------- Zend/zend_execute.c | 4 ++-- 6 files changed, 18 insertions(+), 27 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_053.phpt b/Zend/tests/type_declarations/typed_properties_053.phpt index 6fb25191dd14..45255ef9e962 100644 --- a/Zend/tests/type_declarations/typed_properties_053.phpt +++ b/Zend/tests/type_declarations/typed_properties_053.phpt @@ -4,23 +4,15 @@ Default values of callable properties --EXPECT-- -object(A)#1 (2) { +object(A)#1 (1) { ["a1"]=> uninitialized(callable) ["a2"]=> - string(3) "foo" - ["a3"]=> - array(2) { - [0]=> - string(1) "A" - [1]=> - string(3) "bar" - } + NULL } diff --git a/Zend/tests/type_declarations/typed_properties_054.phpt b/Zend/tests/type_declarations/typed_properties_054.phpt index eaef4212b61a..e6fbf355ff0f 100644 --- a/Zend/tests/type_declarations/typed_properties_054.phpt +++ b/Zend/tests/type_declarations/typed_properties_054.phpt @@ -9,4 +9,4 @@ $obj = new A; var_dump($obj); ?> --EXPECTF-- -Fatal error: Default value for properties with callable type can only be a string or an array in %styped_properties_054.php on line 3 +Fatal error: Default value for properties with callable type can only be null in %styped_properties_054.php on line 3 diff --git a/Zend/zend.c b/Zend/zend.c index cffd8cbcb00f..af43cb1f23a9 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -785,11 +785,13 @@ static void zend_resolve_property_types(void) /* {{{ */ ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) { if (prop_info->type == IS_OBJECT && prop_info->type_name) { + zend_string *type_name = zend_string_tolower(prop_info->type_name); zend_class_entry *prop_ce = - (zend_class_entry*)zend_hash_find(CG(class_table), prop_info->type_name); + (zend_class_entry*)zend_hash_find_ptr(CG(class_table), type_name); assert(prop_ce && prop_ce->type == ZEND_INTERNAL_CLASS); prop_info->type_ce = prop_ce; + zend_string_release(type_name); } }ZEND_HASH_FOREACH_END(); } diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 599ecba0ee6e..a0f6c1916584 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -1152,7 +1152,7 @@ static void zend_ast_export_ex(smart_str *str, zend_ast *ast, int priority, int if (type_ast->attr & ZEND_TYPE_NULLABLE) { smart_str_appendc(str, '?'); } - zend_ast_export_name( + zend_ast_export_ns_name( str, type_ast, 0, indent); smart_str_appendc(str, ' '); } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 021b297e3164..70a65a492a9c 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2601,7 +2601,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, int by_ref); +void 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 void zend_compile_list_assign(znode *result, zend_ast *ast, znode *expr_node, zend_bool old_style); @@ -2735,7 +2735,7 @@ zend_op *zend_compile_static_prop_common(znode *result, zend_ast *ast, uint32_t } if (opline->op1_type == IS_CONST) { convert_to_string(CT_CONSTANT(opline->op1)); - zend_alloc_polymorphic_cache_slots(opline->op1.constant, 2); + zend_alloc_polymorphic_cache_slot(opline->op1.constant); } if (class_node.op_type == IS_CONST) { opline->op2_type = IS_CONST; @@ -5608,7 +5608,7 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ zend_const_expr_to_zval(&value_zv, value_ast); if (optional_type && !Z_CONSTANT(value_zv)) { - if (allow_null && Z_TYPE(value_zv) == IS_NULL) { + if (allow_null && Z_TYPE(value_zv) == IS_NULL) { /* pass */ } else if (optional_type == IS_ARRAY) { if (Z_TYPE(value_zv) != IS_ARRAY) { @@ -5616,9 +5616,9 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ "Default value for properties with array type can only be an array"); } } else if (optional_type == IS_CALLABLE) { - if (Z_TYPE(value_zv) != IS_STRING && Z_TYPE(value_zv) != IS_ARRAY) { + if (Z_TYPE(value_zv) != IS_NULL) { zend_error_noreturn(E_COMPILE_ERROR, - "Default value for properties with callable type can only be a string or an array"); + "Default value for properties with callable type can only be null"); } } else if (optional_type == IS_OBJECT) { zend_error_noreturn(E_COMPILE_ERROR, @@ -5637,11 +5637,8 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ } name = zend_new_interned_string_safe(name); - if (optional_type) { - zend_declare_typed_property(ce, name, &value_zv, flags, doc_comment, optional_type, optional_type_name, allow_null); - } else { - zend_declare_property_ex(ce, name, &value_zv, flags, doc_comment); - } + + zend_declare_typed_property(ce, name, &value_zv, flags, doc_comment, optional_type, optional_type_name, allow_null); } } /* }}} */ @@ -7980,7 +7977,7 @@ void zend_compile_var(znode *result, zend_ast *ast, uint32_t type, int by_ref) / } /* }}} */ -void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, int by_ref) /* {{{ */ +void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, zend_bool by_ref) /* {{{ */ { zend_op *opline; switch (ast->kind) { diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 81f6d02f1d65..b10f96922c03 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -701,7 +701,7 @@ static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *a if (arg != ret) { ZVAL_COPY(ret, arg); - /* on success "arg" is converted to IS_STRING */ + /* on success "ret" is converted to IS_STRING */ if (!zend_parse_arg_str_weak(ret, &dest)) { zval_ptr_dtor(ret); return 0; @@ -709,7 +709,7 @@ static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *a zval_ptr_dtor(arg); return 1; } - /* on success "arg" is converted to IS_STRING */ + /* on success "ret" is converted to IS_STRING */ if (!zend_parse_arg_str_weak(ret, &dest)) { return 0; } From 71cda1bf485a9ad2e0b50a6720c3d3bb9956a7ee Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 7 Jun 2016 07:50:28 +0100 Subject: [PATCH 197/369] make consistent with RFC (nullables) --- .../tests/type_declarations/typed_properties_047.phpt | 4 +--- .../tests/type_declarations/typed_properties_048.phpt | 4 +--- Zend/zend_object_handlers.c | 11 ++++++----- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_047.phpt b/Zend/tests/type_declarations/typed_properties_047.phpt index d3bdc239c573..fdd547333a6a 100644 --- a/Zend/tests/type_declarations/typed_properties_047.phpt +++ b/Zend/tests/type_declarations/typed_properties_047.phpt @@ -56,7 +56,5 @@ object(Foo)#1 (1) { NULL int(5) NULL - -Notice: Undefined property: Foo::$foo in %styped_properties_047.php on line 38 -NULL +Typed property Foo::$foo must not be accessed before initialization Typed property Foo::$foo must be integer, string used diff --git a/Zend/tests/type_declarations/typed_properties_048.phpt b/Zend/tests/type_declarations/typed_properties_048.phpt index 0bdb0f602f77..59ca7e3bd427 100644 --- a/Zend/tests/type_declarations/typed_properties_048.phpt +++ b/Zend/tests/type_declarations/typed_properties_048.phpt @@ -56,7 +56,5 @@ object(Foo)#1 (1) { NULL int(5) NULL - -Notice: Undefined property: Foo::$foo in %styped_properties_048.php on line 38 -NULL +Typed property Foo::$foo must not be accessed before initialization Typed property Foo::$foo must be integer, string used diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 3639a9de5e0f..227871c115f2 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -694,12 +694,13 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ } } if ((type != BP_VAR_IS)) { - if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot)) - && UNEXPECTED(!prop_info->allow_null)) { - zend_throw_exception_ex(zend_ce_type_error, prop_info->type, + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot))) { + if (UNEXPECTED(!prop_info->allow_null || Z_TYPE_P(retval) == IS_UNDEF)) { + zend_throw_exception_ex(zend_ce_type_error, prop_info->type, "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - Z_STRVAL_P(member)); + ZSTR_VAL(prop_info->ce->name), + Z_STRVAL_P(member)); + } } else { zend_error(E_NOTICE,"Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), Z_STRVAL_P(member)); } From 8eec27f9db01817677321f0fbd1aed6971fb386c Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Tue, 7 Jun 2016 08:01:23 +0100 Subject: [PATCH 198/369] fix inheritance error --- Zend/zend_inheritance.c | 46 ++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 0b82707668c6..09ef7ed129c5 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -707,38 +707,36 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke } } - if (!(child_info->flags & ZEND_ACC_CHANGED)) { - if (UNEXPECTED(parent_info->type && !(parent_info->flags & ZEND_ACC_PRIVATE))) { - if (parent_info->type == IS_OBJECT) { - if (child_info->type != IS_OBJECT || - child_info->allow_null != parent_info->allow_null || - !zend_string_equals_ci(zend_resolve_property_type(parent_info->type_name, parent_info->ce), - zend_resolve_property_type(child_info->type_name, child_info->ce))) { - zend_error_noreturn(E_COMPILE_ERROR, - "Type of %s::$%s must be %s%s (as in class %s)", - ZSTR_VAL(ce->name), - ZSTR_VAL(key), - parent_info->allow_null ? "?" : "", - ZSTR_VAL(zend_resolve_property_type(parent_info->type_name, parent_info->ce)), - ZSTR_VAL(ce->parent->name)); - } - } else if (parent_info->type != child_info->type || - parent_info->allow_null != child_info->allow_null) { + if (UNEXPECTED(parent_info->type && !(parent_info->flags & ZEND_ACC_PRIVATE))) { + if (parent_info->type == IS_OBJECT) { + if (child_info->type != IS_OBJECT || + child_info->allow_null != parent_info->allow_null || + !zend_string_equals_ci(zend_resolve_property_type(parent_info->type_name, parent_info->ce), + zend_resolve_property_type(child_info->type_name, child_info->ce))) { zend_error_noreturn(E_COMPILE_ERROR, - "Type of %s::$%s must be %s%s (as in class %s)", + "Type of %s::$%s must be %s%s (as in class %s)", ZSTR_VAL(ce->name), ZSTR_VAL(key), parent_info->allow_null ? "?" : "", - zend_get_type_by_const(parent_info->type), + ZSTR_VAL(zend_resolve_property_type(parent_info->type_name, parent_info->ce)), ZSTR_VAL(ce->parent->name)); } - } else if (UNEXPECTED(child_info->type && !parent_info->type)) { + } else if (parent_info->type != child_info->type || + parent_info->allow_null != child_info->allow_null) { 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)); + "Type of %s::$%s must be %s%s (as in class %s)", + ZSTR_VAL(ce->name), + ZSTR_VAL(key), + parent_info->allow_null ? "?" : "", + zend_get_type_by_const(parent_info->type), + ZSTR_VAL(ce->parent->name)); } + } else if (UNEXPECTED(child_info->type && !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|ZEND_ACC_SHADOW))) { From 1b8bd8856d0888e15d298053869bc44726f70fc3 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 10 Nov 2016 15:11:53 +0100 Subject: [PATCH 199/369] Initial ref types patch Tests and functions outside ext/standard still need patching --- Zend/zend_API.c | 33 +- Zend/zend_API.h | 103 +- Zend/zend_compile.c | 8 +- Zend/zend_execute.c | 69 +- Zend/zend_execute.h | 42 +- Zend/zend_object_handlers.c | 4 +- Zend/zend_types.h | 6 + Zend/zend_vm_def.h | 253 +- Zend/zend_vm_execute.h | 3315 +++++++++++++++++++++++--- Zend/zend_vm_gen.php | 53 +- Zend/zend_vm_opcodes.c | 4 +- Zend/zend_vm_opcodes.h | 1 + ext/intl/formatter/formatter_parse.c | 14 +- ext/standard/basic_functions.c | 7 +- ext/standard/dns.c | 4 +- ext/standard/exec.c | 7 +- ext/standard/file.c | 7 +- ext/standard/fsock.c | 7 +- ext/standard/head.c | 10 +- ext/standard/image.c | 2 +- ext/standard/proc_open.c | 2 +- ext/standard/scanf.c | 34 +- ext/standard/streamsfuncs.c | 51 +- ext/standard/string.c | 17 +- 24 files changed, 3513 insertions(+), 540 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 75bd2c0c85d1..70449de2d743 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -500,9 +500,13 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons int check_null = 0; int separate = 0; zval *real_arg = arg; + void *ref_type = NULL; /* scan through modifiers */ - ZVAL_DEREF(arg); + if (UNEXPECTED(Z_ISREF_P(arg))) { + ref_type = Z_REF_P(arg)->type; + arg = Z_REFVAL_P(arg); + } while (1) { if (*spec_walk == '/') { SEPARATE_ZVAL_NOREF(arg); @@ -527,7 +531,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons is_null = va_arg(*va, zend_bool *); } - if (!zend_parse_arg_long(arg, p, is_null, check_null, c == 'L')) { + if (!zend_parse_arg_long(arg, p, is_null, check_null, c == 'L', ref_type)) { return "integer"; } } @@ -542,7 +546,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons is_null = va_arg(*va, zend_bool *); } - if (!zend_parse_arg_double(arg, p, is_null, check_null)) { + if (!zend_parse_arg_double(arg, p, is_null, check_null, ref_type)) { return "float"; } } @@ -552,7 +556,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons { char **p = va_arg(*va, char **); size_t *pl = va_arg(*va, size_t *); - if (!zend_parse_arg_string(arg, p, pl, check_null)) { + if (!zend_parse_arg_string(arg, p, pl, check_null, ref_type)) { return "string"; } } @@ -562,7 +566,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons { char **p = va_arg(*va, char **); size_t *pl = va_arg(*va, size_t *); - if (!zend_parse_arg_path(arg, p, pl, check_null)) { + if (!zend_parse_arg_path(arg, p, pl, check_null, ref_type)) { return "a valid path"; } } @@ -571,7 +575,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons case 'P': { zend_string **str = va_arg(*va, zend_string **); - if (!zend_parse_arg_path_str(arg, str, check_null)) { + if (!zend_parse_arg_path_str(arg, str, check_null, ref_type)) { return "a valid path"; } } @@ -580,7 +584,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons case 'S': { zend_string **str = va_arg(*va, zend_string **); - if (!zend_parse_arg_str(arg, str, check_null)) { + if (!zend_parse_arg_str(arg, str, check_null, ref_type)) { return "string"; } } @@ -595,7 +599,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons is_null = va_arg(*va, zend_bool *); } - if (!zend_parse_arg_bool(arg, p, is_null, check_null)) { + if (!zend_parse_arg_bool(arg, p, is_null, check_null, ref_type)) { return "boolean"; } } @@ -633,6 +637,17 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons } break; + case 't': + { + zval **p = va_arg(*va, zval **); + + if (ref_type && !zend_verify_ref_type_assignable(ref_type, IS_ARRAY)) { + return "array"; + } + + zend_parse_arg_zval_deref(real_arg, p, check_null); + } + case 'o': { zval **p = va_arg(*va, zval **); @@ -825,7 +840,7 @@ static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va, case 'f': case 'A': case 'H': case 'p': case 'S': case 'P': - case 'L': + case 'L': case 't': max_num_args++; break; diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 4f8d36fac2af..de6a86b75e96 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -678,6 +678,43 @@ END_EXTERN_C() #define ZEND_GINIT_FUNCTION ZEND_MODULE_GLOBALS_CTOR_D #define ZEND_GSHUTDOWN_FUNCTION ZEND_MODULE_GLOBALS_DTOR_D +static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { + void *ref_type; + if (EXPECTED(Z_ISREF_P(zv)) && UNEXPECTED((ref_type = Z_REFTYPE_P(zv)) != NULL)) { + zval tmp; + ZVAL_COPY(&tmp, arg); + if (zend_verify_ref_type_assignable_zval(ref_type, &tmp, ZEND_ARG_USES_STRICT_TYPES())) { + zv = Z_REFVAL_P(zv); + zval_ptr_dtor(zv); + ZVAL_COPY_VALUE(zv, &tmp); + } else { + zend_throw_ref_type_error(ref_type, &tmp); + zval_ptr_dtor(&tmp); + return FAILURE; + } + } else { + zval_ptr_dtor(zv); + ZVAL_COPY(zv, arg); + } + + return SUCCESS; +} + +#define ZEND_TRY_ASSIGN(func, zv, ...) \ + do { \ + zval _zv; \ + func(&_zv, ##__VA_ARGS__); \ + zend_try_assign(zv, &_zv); \ + } while (0) + +#define ZEND_TRY_ASSIGN_NULL(zv) ZEND_TRY_ASSIGN(ZVAL_NULL, zv) +#define ZEND_TRY_ASSIGN_LONG(zv, long) ZEND_TRY_ASSIGN(ZVAL_LONG, zv, long) +#define ZEND_TRY_ASSIGN_DOUBLE(zv, double) ZEND_TRY_ASSIGN(ZVAL_DOUBLE, zv, double) +#define ZEND_TRY_ASSIGN_EMPTY_STRING(zv) ZEND_TRY_ASSIGN(ZVAL_EMPTY_STRING, zv) +#define ZEND_TRY_ASSIGN_STR(zv, str) ZEND_TRY_ASSIGN(ZVAL_STR, zv, str) +#define ZEND_TRY_ASSIGN_STRING(zv, string) ZEND_TRY_ASSIGN(ZVAL_STRING, zv, string) +#define ZEND_TRY_ASSIGN_STRINGL(zv, string, len) ZEND_TRY_ASSIGN(ZVAL_STRINGL, zv, string, len) + /* Fast parameter parsing API */ /* Fast ZPP is always enabled now; this define is left in for compatibility @@ -725,6 +762,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in zval *_real_arg, *_arg = NULL; \ zend_expected_type _expected_type = IS_UNDEF; \ char *_error = NULL; \ + void *_ref_type; \ zend_bool _dummy; \ zend_bool _optional = 0; \ int error_code = ZPP_ERROR_OK; \ @@ -733,6 +771,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in ((void)_arg); \ ((void)_expected_type); \ ((void)_error); \ + ((void)_ref_type); \ ((void)_dummy); \ ((void)_optional); \ \ @@ -780,7 +819,12 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in } \ _real_arg++; \ _arg = _real_arg; \ - ZVAL_DEREF(_arg); \ + if (UNEXPECTED(Z_ISREF_P(_arg))) { \ + _ref_type = Z_REF_P(_arg)->type; \ + _arg = Z_REFVAL_P(_arg); \ + } else { \ + _ref_type = NULL; \ + } \ if (separate) { \ SEPARATE_ZVAL_NOREF(_arg); \ } @@ -816,7 +860,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "b" */ #define Z_PARAM_BOOL_EX(dest, is_null, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_bool(_arg, &dest, &is_null, check_null))) { \ + if (UNEXPECTED(!zend_parse_arg_bool(_arg, &dest, &is_null, check_null, _ref_type))) { \ _expected_type = Z_EXPECTED_BOOL; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -839,7 +883,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "d" */ #define Z_PARAM_DOUBLE_EX(dest, is_null, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_double(_arg, &dest, &is_null, check_null))) { \ + if (UNEXPECTED(!zend_parse_arg_double(_arg, &dest, &is_null, check_null, _ref_type))) { \ _expected_type = Z_EXPECTED_DOUBLE; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -894,7 +938,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "l" */ #define Z_PARAM_LONG_EX(dest, is_null, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 0))) { \ + if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 0, _ref_type))) { \ _expected_type = Z_EXPECTED_LONG; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -906,7 +950,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "L" */ #define Z_PARAM_STRICT_LONG_EX(dest, is_null, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 1))) { \ + if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 1, _ref_type))) { \ _expected_type = Z_EXPECTED_LONG; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -948,7 +992,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "p" */ #define Z_PARAM_PATH_EX(dest, dest_len, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_path(_arg, &dest, &dest_len, check_null))) { \ + if (UNEXPECTED(!zend_parse_arg_path(_arg, &dest, &dest_len, check_null, _ref_type))) { \ _expected_type = Z_EXPECTED_PATH; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -960,7 +1004,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "P" */ #define Z_PARAM_PATH_STR_EX(dest, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_path_str(_arg, &dest, check_null))) { \ + if (UNEXPECTED(!zend_parse_arg_path_str(_arg, &dest, check_null, _ref_type))) { \ _expected_type = Z_EXPECTED_PATH; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -984,7 +1028,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "s" */ #define Z_PARAM_STRING_EX(dest, dest_len, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_string(_arg, &dest, &dest_len, check_null))) { \ + if (UNEXPECTED(!zend_parse_arg_string(_arg, &dest, &dest_len, check_null, _ref_type))) { \ _expected_type = Z_EXPECTED_STRING; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -996,7 +1040,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "S" */ #define Z_PARAM_STR_EX(dest, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_str(_arg, &dest, check_null))) { \ + if (UNEXPECTED(!zend_parse_arg_str(_arg, &dest, check_null, _ref_type))) { \ _expected_type = Z_EXPECTED_STRING; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -1005,6 +1049,19 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in #define Z_PARAM_STR(dest) \ Z_PARAM_STR_EX(dest, 0, 0) +/* old "t" */ +#define Z_PARAM_ARRAY_ASSIGNABLE_EX(dest, check_null, separate) \ + Z_PARAM_PROLOGUE(separate); \ + if (_ref_type && (((uintptr_t) _ref_type) >> 1) != IS_ARRAY) { \ + _expected_type = Z_EXPECTED_ARRAY; \ + error_code = ZPP_ERROR_WRONG_ARG; \ + break; \ + } \ + zend_parse_arg_zval_deref(_arg, &dest, check_null); + +#define Z_PARAM_ARRAY_ASSIGNABLE(dest) \ + Z_PARAM_ARRAY_ASSIGNABLE_EX(dest, 0, 0) + /* old "z" */ #define Z_PARAM_ZVAL_EX(dest, check_null, separate) \ if (separate) { \ @@ -1063,7 +1120,7 @@ ZEND_API int ZEND_FASTCALL zend_parse_arg_double_weak(zval *arg, double *dest); ZEND_API int ZEND_FASTCALL zend_parse_arg_str_slow(zval *arg, zend_string **dest); ZEND_API int ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, zend_string **dest); -static zend_always_inline int zend_parse_arg_bool(zval *arg, zend_bool *dest, zend_bool *is_null, int check_null) +static zend_always_inline int zend_parse_arg_bool(zval *arg, zend_bool *dest, zend_bool *is_null, int check_null, void *ref_type) { if (check_null) { *is_null = 0; @@ -1072,6 +1129,8 @@ static zend_always_inline int zend_parse_arg_bool(zval *arg, zend_bool *dest, ze *dest = 1; } else if (EXPECTED(Z_TYPE_P(arg) == IS_FALSE)) { *dest = 0; + } else if (ref_type && ((uintptr_t) ref_type) >> 1 != _IS_BOOL) { + return 0; } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { *is_null = 1; *dest = 0; @@ -1081,13 +1140,15 @@ static zend_always_inline int zend_parse_arg_bool(zval *arg, zend_bool *dest, ze return 1; } -static zend_always_inline int zend_parse_arg_long(zval *arg, zend_long *dest, zend_bool *is_null, int check_null, int cap) +static zend_always_inline int zend_parse_arg_long(zval *arg, zend_long *dest, zend_bool *is_null, int check_null, int cap, void *ref_type) { if (check_null) { *is_null = 0; } if (EXPECTED(Z_TYPE_P(arg) == IS_LONG)) { *dest = Z_LVAL_P(arg); + } else if (ref_type && ((uintptr_t) ref_type) >> 1 != IS_LONG) { + return 0; } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { *is_null = 1; *dest = 0; @@ -1099,13 +1160,15 @@ static zend_always_inline int zend_parse_arg_long(zval *arg, zend_long *dest, ze return 1; } -static zend_always_inline int zend_parse_arg_double(zval *arg, double *dest, zend_bool *is_null, int check_null) +static zend_always_inline int zend_parse_arg_double(zval *arg, double *dest, zend_bool *is_null, int check_null, void *ref_type) { if (check_null) { *is_null = 0; } if (EXPECTED(Z_TYPE_P(arg) == IS_DOUBLE)) { *dest = Z_DVAL_P(arg); + } else if (ref_type && ((uintptr_t) ref_type) >> 1 != IS_DOUBLE) { + return 0; } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { *is_null = 1; *dest = 0.0; @@ -1115,10 +1178,12 @@ static zend_always_inline int zend_parse_arg_double(zval *arg, double *dest, zen return 1; } -static zend_always_inline int zend_parse_arg_str(zval *arg, zend_string **dest, int check_null) +static zend_always_inline int zend_parse_arg_str(zval *arg, zend_string **dest, int check_null, void *ref_type) { if (EXPECTED(Z_TYPE_P(arg) == IS_STRING)) { *dest = Z_STR_P(arg); + } else if (ref_type && ((uintptr_t) ref_type) >> 1 != IS_STRING) { + return 0; } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { *dest = NULL; } else { @@ -1127,11 +1192,11 @@ static zend_always_inline int zend_parse_arg_str(zval *arg, zend_string **dest, return 1; } -static zend_always_inline int zend_parse_arg_string(zval *arg, char **dest, size_t *dest_len, int check_null) +static zend_always_inline int zend_parse_arg_string(zval *arg, char **dest, size_t *dest_len, int check_null, void *ref_type) { zend_string *str; - if (!zend_parse_arg_str(arg, &str, check_null)) { + if (!zend_parse_arg_str(arg, &str, check_null, ref_type)) { return 0; } if (check_null && UNEXPECTED(!str)) { @@ -1144,20 +1209,20 @@ static zend_always_inline int zend_parse_arg_string(zval *arg, char **dest, size return 1; } -static zend_always_inline int zend_parse_arg_path_str(zval *arg, zend_string **dest, int check_null) +static zend_always_inline int zend_parse_arg_path_str(zval *arg, zend_string **dest, int check_null, void *ref_type) { - if (!zend_parse_arg_str(arg, dest, check_null) || + if (!zend_parse_arg_str(arg, dest, check_null, ref_type) || (*dest && UNEXPECTED(CHECK_NULL_PATH(ZSTR_VAL(*dest), ZSTR_LEN(*dest))))) { return 0; } return 1; } -static zend_always_inline int zend_parse_arg_path(zval *arg, char **dest, size_t *dest_len, int check_null) +static zend_always_inline int zend_parse_arg_path(zval *arg, char **dest, size_t *dest_len, int check_null, void *ref_type) { zend_string *str; - if (!zend_parse_arg_path_str(arg, &str, check_null)) { + if (!zend_parse_arg_path_str(arg, &str, check_null, ref_type)) { return 0; } if (check_null && UNEXPECTED(!str)) { diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 5d895387148e..0c2355dc9840 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3081,7 +3081,13 @@ void zend_compile_assign_ref(znode *result, zend_ast *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); + opline = &CG(active_op_array)->opcodes[CG(active_op_array)->last - 1]; + if (target_node.op_type == IS_VAR && opline->opcode == ZEND_FETCH_OBJ_W) { + opline->opcode = ZEND_ASSIGN_OBJ_REF; + zend_emit_op_data(&source_node); + } else { + opline = zend_emit_op(result, ZEND_ASSIGN_REF, &target_node, &source_node); + } if (zend_is_call(source_ast)) { opline->extended_value = ZEND_RETURNS_FUNCTION; diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9f1d572871e0..8a13c4bb5510 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -954,6 +954,37 @@ zval* zend_verify_property_type(zend_property_info *info, zval *property, zval * return i_zend_verify_property_type(info, property, tmp, strict); } +static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(void *type, zval *zv, zend_bool strict) { + zend_uchar cur_type; + + if (!type) { + return 1; + } + if (Z_TYPE_P(zv) == IS_REFERENCE) { + ZVAL_DEREF(zv); + } + + if (Z_TYPE_P(zv) == IS_OBJECT) { + return ((uintptr_t) type) > 0xFF && instanceof_function(Z_OBJCE_P(zv), (zend_class_entry *) (~0x1 & (uintptr_t) type)); + } + + if (zend_verify_ref_type_assignable(type, Z_TYPE_P(zv))) { + return 1; + } + + cur_type = ((uintptr_t) type) >> 1; + if (cur_type == IS_CALLABLE) { + return zend_is_callable(zv, IS_CALLABLE_CHECK_SILENT, NULL); + } + + return zend_verify_scalar_type_hint(cur_type, zv, zv, strict); +} + +ZEND_API zend_bool zend_verify_ref_type_assignable_zval(void *type, zval *zv, zend_bool strict) +{ + return i_zend_verify_ref_type_assignable_zval(type, zv, strict); +} + static zend_never_inline int zend_verify_internal_arg_types(zend_function *fbc, zend_execute_data *call) { uint32_t i; @@ -976,11 +1007,17 @@ static zend_always_inline zend_bool zend_check_type( zval *arg, zend_class_entry **ce, void **cache_slot, zval *default_value, zend_bool is_return_type) { + void *ref_type = NULL; + if (!arg_info->type_hint) { return 1; } - ZVAL_DEREF(arg); + if (UNEXPECTED(Z_ISREF_P(arg))) { + ref_type = Z_REFTYPE_P(arg); + arg = Z_REFVAL_P(arg); + } + if (EXPECTED(arg_info->type_hint == Z_TYPE_P(arg))) { if (arg_info->class_name) { if (EXPECTED(*cache_slot)) { @@ -1022,6 +1059,8 @@ static zend_always_inline zend_bool zend_check_type( } else if (arg_info->type_hint == _IS_BOOL && EXPECTED(Z_TYPE_P(arg) == IS_FALSE || Z_TYPE_P(arg) == IS_TRUE)) { return 1; + } else if (ref_type) { + return 0; /* we cannot have conversions for typed refs */ } else { return zend_verify_scalar_type_hint(arg_info->type_hint, arg, arg, is_return_type ? ZEND_RET_USES_STRICT_TYPES() : ZEND_ARG_USES_STRICT_TYPES()); @@ -2098,8 +2137,8 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c return_indirect: ZVAL_INDIRECT(result, ptr); if ((by_ref & ZEND_FETCH_REF) - && (prop_op_type == IS_CONST - || EXPECTED(Z_TYPE_P(prop_ptr) == IS_STRING))) { + && (prop_op_type == IS_CONST || EXPECTED(Z_TYPE_P(prop_ptr) == IS_STRING)) + && Z_TYPE_P(ptr) != IS_REFERENCE) { zend_property_info *prop_info; if (prop_op_type == IS_CONST) { @@ -2108,10 +2147,15 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(prop_ptr), NULL); } if (UNEXPECTED(prop_info)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(prop_ptr)); + if (!prop_info->allow_null && Z_TYPE_P(ptr) == IS_NULL) { + zend_throw_error(NULL, "Cannot access uninitialized non-nullable property by reference"); + ZVAL_UNDEF(ptr); + ZVAL_ERROR(result); + return; + } + + ZVAL_NEW_REF(ptr, ptr); + Z_REF_P(ptr)->type = zend_get_prop_info_ref_type(prop_info); } } return; @@ -2156,6 +2200,17 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } } +ZEND_API ZEND_COLD void zend_throw_ref_type_error(void *type, zval *zv) { + zend_throw_exception_ex( + zend_ce_type_error, 0, + "Cannot assign %s to reference 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)), + (0x1 & (uintptr_t) type) ? "?" : "", + (0xFF < (uintptr_t) type) ? ZSTR_VAL(((zend_class_entry *) (~0x1 & (uintptr_t) type))->name) : zend_get_type_by_const(((uintptr_t) type) >> 1) + ); +} + + #if ZEND_INTENSIVE_DEBUGGING #define CHECK_SYMBOL_TABLES() \ diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 237535ef696b..49cdaaee7247 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -56,7 +56,42 @@ ZEND_API void ZEND_FASTCALL zend_check_internal_arg_type(zend_function *zf, uint ZEND_API int ZEND_FASTCALL zend_check_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot); ZEND_API ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(zend_execute_data *execute_data); -static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type) +static zend_always_inline void *zend_get_prop_info_ref_type(zend_property_info *prop_info) { + if (prop_info->type == IS_OBJECT && UNEXPECTED(!prop_info->type_ce)) { + if (zend_string_equals_literal_ci(prop_info->type_name, "self")) { + prop_info->type_ce = prop_info->ce; + } else if (zend_string_equals_literal_ci(prop_info->type_name, "parent")) { + if (!prop_info->ce->parent) { + zend_throw_error(NULL, "Cannot access parent:: when current class scope has no parent"); + return (void *) 0xFE; + } + prop_info->type_ce = prop_info->ce->parent; + } else { + prop_info->type_ce = zend_lookup_class(prop_info->type_name); + if (!prop_info->type_ce) { + zend_throw_error(NULL, "Class %s must be loaded when used by reference for property type", ZSTR_VAL(prop_info->type_name)); + return (void *) 0xFE; + } + } + } + + return (void *) (((prop_info->type & ~IS_OBJECT) << 1) | prop_info->allow_null | (uintptr_t) prop_info->type_ce); +} + +/* do not call when new_type == IS_REFERENCE or new_type == IS_OBJECT! */ +static zend_always_inline zend_bool zend_verify_ref_type_assignable(void *type, zend_uchar new_type) { + if (0xFF >= (uintptr_t) type) { + zend_uchar cur_type = ((uintptr_t) type) >> 1; + return new_type == cur_type || (new_type == _IS_BOOL && (cur_type == IS_FALSE || cur_type == IS_TRUE)); + } else { + return (0x1 & (uintptr_t) type) && new_type == IS_NULL; + } +} + +ZEND_API zend_bool zend_verify_ref_type_assignable_zval(void *type, zval *zv, zend_bool strict); +ZEND_API ZEND_COLD void zend_throw_ref_type_error(void *type, zval *zv); + +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 +105,11 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval zend_refcounted *garbage; if (Z_ISREF_P(variable_ptr)) { + if (!zend_verify_ref_type_assignable_zval(Z_REF_P(variable_ptr)->type, value, strict)) { + zend_throw_ref_type_error(Z_REF_P(variable_ptr)->type, value); + return Z_REFVAL_P(variable_ptr); + } + variable_ptr = Z_REFVAL_P(variable_ptr); if (EXPECTED(!Z_REFCOUNTED_P(variable_ptr))) { break; diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index eb0f529df107..4638aaf38825 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -720,7 +720,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v zval tmp, *val; if (UNEXPECTED(prop_info)) { - val = zend_verify_property_type(prop_info, value, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); + val = zend_verify_property_type(prop_info, value, &tmp, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(member), value); goto exit; @@ -728,7 +728,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v value = val; } found: - zend_assign_to_variable(variable_ptr, value, IS_CV); + zend_assign_to_variable(variable_ptr, value, IS_CV, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); goto exit; } } else if (EXPECTED(zobj->properties != NULL)) { diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 9d4f6a7d4caa..736693c931e4 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -292,6 +292,7 @@ struct _zend_resource { struct _zend_reference { zend_refcounted_h gc; zval val; + zend_class_entry *type; }; struct _zend_ast_ref { @@ -572,6 +573,9 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { #define Z_REFVAL(zval) &Z_REF(zval)->val #define Z_REFVAL_P(zval_p) Z_REFVAL(*(zval_p)) +#define Z_REFTYPE(zval) &Z_REF(zval)->type +#define Z_REFTYPE_P(zval_p) Z_REFTYPE(*(zval_p)) + #define Z_AST(zval) (zval).value.ast #define Z_AST_P(zval_p) Z_AST(*(zval_p)) @@ -733,6 +737,7 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { (zend_reference *) emalloc(sizeof(zend_reference)); \ GC_REFCOUNT(_ref) = 1; \ GC_TYPE_INFO(_ref) = IS_REFERENCE; \ + _ref->type = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ } while (0) @@ -743,6 +748,7 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { GC_REFCOUNT(_ref) = 1; \ GC_TYPE_INFO(_ref) = IS_REFERENCE; \ ZVAL_COPY_VALUE(&_ref->val, r); \ + _ref->type = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ } while (0) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 461a33f153b0..7d8a9c2aeb82 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -955,10 +955,30 @@ ZEND_VM_HELPER(zend_binary_assign_op_helper, VAR|CV, CONST|TMPVAR|CV, binary_op_ ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); + void *type = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + binary_op(var_ptr, var_ptr, value); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -1451,6 +1471,7 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) USE_OPLINE zend_free_op free_op1; zval *var_ptr; + void *type = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1473,10 +1494,30 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) 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_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + increment_function(var_ptr); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -1491,6 +1532,7 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) USE_OPLINE zend_free_op free_op1; zval *var_ptr; + void *type = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1513,10 +1555,30 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) 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_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + decrement_function(var_ptr); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -1530,7 +1592,8 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) { USE_OPLINE zend_free_op free_op1; - zval *var_ptr; + zval *var_ptr, *val; + void *type = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1549,12 +1612,23 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) 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_DEREF(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + FREE_OP1_VAR_PTR(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -1564,6 +1638,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr; + void *type = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1582,12 +1657,23 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) 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_DEREF(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + FREE_OP1_VAR_PTR(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -2423,7 +2509,7 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( } ZEND_VM_C_LABEL(fast_assign_obj): - value = zend_assign_to_variable(property, value, OP_DATA_TYPE); + value = zend_assign_to_variable(property, value, OP_DATA_TYPE, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -2545,7 +2631,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array): } } 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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -2620,7 +2706,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -2642,17 +2728,7 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC) value_ptr = GET_OP2_ZVAL_PTR_PTR(BP_VAR_W); variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); - if (OP1_TYPE == IS_VAR && - UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && - UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var))) && - UNEXPECTED(!Z_ISERROR_P(EX_VAR(opline->op1.var)))) { - - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - FREE_OP1_VAR_PTR(); - FREE_OP2_VAR_PTR(); - HANDLE_EXCEPTION(); - - } else if (OP2_TYPE == IS_VAR && + if (OP2_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); @@ -2661,7 +2737,7 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC) HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, OP2_TYPE); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, OP2_TYPE, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -2687,6 +2763,127 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC) ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +ZEND_VM_HANDLER(100, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SRC, SPEC(OP_DATA=VAR|CV)) +{ + USE_OPLINE + zend_free_op free_op1, free_op2, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (OP_DATA_TYPE == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + FREE_UNFETCHED_OP1(); + FREE_UNFETCHED_OP2(); + FREE_UNFETCHED_OP_DATA(); + HANDLE_EXCEPTION(); + } + + ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ASSIGN_OBJ); + } + + property = GET_OP2_ZVAL_PTR(BP_VAR_R); + + container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + FREE_OP2(); + FREE_UNFETCHED_OP_DATA(); + HANDLE_EXCEPTION(); + } + + cache_addr = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, OP1_TYPE, property, OP2_TYPE, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_UNFETCHED_OP_DATA(); + 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))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((OP2_TYPE != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (OP2_TYPE == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_OP_DATA_VAR_PTR(); + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_OP_DATA_VAR_PTR(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) { zend_execute_data *old_execute_data; @@ -6348,7 +6545,7 @@ ZEND_VM_C_LABEL(fe_fetch_r_exit): if (EXPECTED(OP2_TYPE == IS_CV)) { zval *variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op2.var); - zend_assign_to_variable(variable_ptr, value, IS_CV); + zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); } else { zval *res = EX_VAR(opline->op2.var); zend_refcounted *gc = Z_COUNTED_P(value); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 3bd2b1982ab9..8f7e318594f4 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -15533,6 +15533,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED USE_OPLINE zend_free_op free_op1; zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -15555,10 +15556,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED 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); - SEPARATE_ZVAL_NOREF(var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + increment_function(var_ptr); + } if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -15573,6 +15594,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H USE_OPLINE zend_free_op free_op1; zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -15595,10 +15617,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H 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); - SEPARATE_ZVAL_NOREF(var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + increment_function(var_ptr); + } if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -15613,6 +15655,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED USE_OPLINE zend_free_op free_op1; zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -15635,10 +15678,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED 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); - SEPARATE_ZVAL_NOREF(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + decrement_function(var_ptr); + } if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -15653,6 +15716,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H USE_OPLINE zend_free_op free_op1; zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -15675,10 +15739,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H 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); - SEPARATE_ZVAL_NOREF(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + decrement_function(var_ptr); + } if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -15692,7 +15776,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND { USE_OPLINE zend_free_op free_op1; - zval *var_ptr; + zval *var_ptr, *val; + void *type = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -15711,12 +15796,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND 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); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -15726,6 +15822,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -15744,12 +15841,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND 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); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -16870,7 +16978,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE if (EXPECTED(opline->op2_type == IS_CV)) { zval *variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op2.var); - zend_assign_to_variable(variable_ptr, value, IS_CV); + zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); } else { zval *res = EX_VAR(opline->op2.var); zend_refcounted *gc = Z_COUNTED_P(value); @@ -17635,10 +17743,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); + void *type = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + binary_op(var_ptr, var_ptr, value); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -18944,7 +19072,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19120,7 +19248,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19296,7 +19424,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19472,7 +19600,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19594,7 +19722,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19685,7 +19813,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19777,7 +19905,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19869,7 +19997,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19943,7 +20071,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19971,7 +20099,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19982,6 +20110,248 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_U ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = EX_CONSTANT(opline->op2); + + container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CONST != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); + + + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = EX_CONSTANT(opline->op2); + + container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CONST != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -20660,7 +21030,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -20688,7 +21058,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -20888,7 +21258,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -20916,7 +21286,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -20939,16 +21309,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); if (IS_VAR == IS_VAR && - UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && - UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var))) && - UNEXPECTED(!Z_ISERROR_P(EX_VAR(opline->op1.var)))) { - - 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);}; - HANDLE_EXCEPTION(); - - } else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); @@ -20957,7 +21317,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -21543,7 +21903,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -21634,7 +21994,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -21726,7 +22086,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -21818,7 +22178,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -22620,10 +22980,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); + void *type = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + binary_op(var_ptr, var_ptr, value); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -23929,7 +24309,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24105,7 +24485,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24281,7 +24661,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24457,7 +24837,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24579,7 +24959,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24670,7 +25050,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24762,7 +25142,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24854,7 +25234,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24928,7 +25308,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24956,7 +25336,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24978,17 +25358,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op2.var); variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && - UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && - UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var))) && - UNEXPECTED(!Z_ISERROR_P(EX_VAR(opline->op1.var)))) { - - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - - HANDLE_EXCEPTION(); - - } else if (IS_CV == IS_VAR && + if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); @@ -24997,7 +25367,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -25022,6 +25392,248 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + + container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CV != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); + + + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + + container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CV != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -25762,10 +26374,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); + void *type = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + binary_op(var_ptr, var_ptr, value); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -27075,7 +27707,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27251,7 +27883,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27427,7 +28059,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27603,7 +28235,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27725,7 +28357,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27816,7 +28448,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27908,7 +28540,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28000,7 +28632,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28057,6 +28689,248 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op2, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + + container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if (((IS_TMP_VAR|IS_VAR) != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op2; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + + container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } + + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if (((IS_TMP_VAR|IS_VAR) != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -29556,7 +30430,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -29732,7 +30606,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -29908,7 +30782,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -30084,7 +30958,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -30172,6 +31046,246 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = EX_CONSTANT(opline->op2); + + container = NULL; + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CONST != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + + + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = EX_CONSTANT(opline->op2); + + container = NULL; + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CONST != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -32442,7 +33556,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -32618,7 +33732,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -32794,7 +33908,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -32970,7 +34084,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -33058,6 +34172,246 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + + container = NULL; + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CV != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + + + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + + container = NULL; + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CV != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -34534,7 +35888,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -34710,7 +36064,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -34886,7 +36240,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -35062,7 +36416,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -35150,6 +36504,246 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op2, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + + container = NULL; + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if (((IS_TMP_VAR|IS_VAR) != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op2; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + + container = NULL; + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } + + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if (((IS_TMP_VAR|IS_VAR) != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + zval_ptr_dtor_nogc(free_op2); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -35624,6 +37218,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ USE_OPLINE zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); @@ -35646,10 +37241,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ 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); - SEPARATE_ZVAL_NOREF(var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + increment_function(var_ptr); + } if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -35663,6 +37278,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA USE_OPLINE zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); @@ -35685,10 +37301,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA 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); - SEPARATE_ZVAL_NOREF(var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + increment_function(var_ptr); + } if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -35702,6 +37338,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ USE_OPLINE zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); @@ -35724,10 +37361,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ 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); - SEPARATE_ZVAL_NOREF(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + decrement_function(var_ptr); + } if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -35741,6 +37398,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA USE_OPLINE zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); @@ -35763,10 +37421,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA 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); - SEPARATE_ZVAL_NOREF(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + decrement_function(var_ptr); + } if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -35779,7 +37457,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ { USE_OPLINE - zval *var_ptr; + zval *var_ptr, *val; + void *type = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); @@ -35798,12 +37477,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ 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); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -35812,6 +37502,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); @@ -35830,12 +37521,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ 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); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -38289,10 +39991,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); + void *type = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + binary_op(var_ptr, var_ptr, value); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -39870,7 +41592,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40046,7 +41768,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40222,7 +41944,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40398,7 +42120,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40520,7 +42242,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40611,7 +42333,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40703,7 +42425,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40795,7 +42517,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40869,7 +42591,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40897,7 +42619,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40908,6 +42630,246 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_US ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = EX_CONSTANT(opline->op2); + + container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CONST != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + + + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = EX_CONSTANT(opline->op2); + + container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CONST != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -42163,7 +44125,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42191,7 +44153,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42527,7 +44489,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42555,7 +44517,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42577,17 +44539,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER value_ptr = _get_zval_ptr_ptr_var(opline->op2.var, execute_data, &free_op2); variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && - UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && - UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var))) && - UNEXPECTED(!Z_ISERROR_P(EX_VAR(opline->op1.var)))) { - - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - - if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);}; - HANDLE_EXCEPTION(); - - } else if (IS_VAR == IS_VAR && + if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); @@ -42596,7 +44548,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -43665,7 +45617,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -43756,7 +45708,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -43848,7 +45800,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -43940,7 +45892,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -45540,10 +47492,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); + void *type = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + binary_op(var_ptr, var_ptr, value); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -46984,7 +48956,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -47160,7 +49132,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -47336,7 +49308,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -47512,7 +49484,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -47634,7 +49606,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -47725,7 +49697,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -47817,7 +49789,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -47909,7 +49881,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -47983,7 +49955,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -48011,7 +49983,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -48034,16 +50006,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER( variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); if (IS_CV == IS_VAR && - UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && - UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var))) && - UNEXPECTED(!Z_ISERROR_P(EX_VAR(opline->op1.var)))) { - - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - - - HANDLE_EXCEPTION(); - - } else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); @@ -48052,7 +50014,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER( HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -48076,6 +50038,246 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER( ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + + container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CV != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + + + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + + container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CV != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -49808,10 +52010,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); + void *type = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + binary_op(var_ptr, var_ptr, value); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -51257,7 +53479,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -51433,7 +53655,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -51609,7 +53831,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -51785,7 +54007,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -51907,7 +54129,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -51998,7 +54220,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -52089,8 +54311,100 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D goto assign_dim_error; } } - value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + } else { + if (EXPECTED(Z_ISREF_P(object_ptr))) { + object_ptr = Z_REFVAL_P(object_ptr); + if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { + goto try_assign_dim_array; + } + } + if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) { + dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + zend_assign_to_object_dim(object_ptr, dim, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op_data); + } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { + if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { + zend_throw_error(NULL, "[] operator not supported for strings"); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + HANDLE_EXCEPTION(); + } else { + dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + value = _get_zval_ptr_var_deref((opline+1)->op1.var, execute_data, &free_op_data); + zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zval_ptr_dtor_nogc(free_op_data); + } + } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + ZVAL_NEW_ARR(object_ptr); + zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0); + goto try_assign_dim_array; + } else { + if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) { + zend_error(E_WARNING, "Cannot use a scalar value as an array"); + } + dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); +assign_dim_error: + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + } + } + if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) { + zval_ptr_dtor_nogc(free_op2); + } + + /* assign_dim has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *object_ptr; + zend_free_op free_op2; + zval *value; + zval *variable_ptr; + zval *dim; + + SAVE_OPLINE(); + object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + + if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { +try_assign_dim_array: + SEPARATE_ARRAY(object_ptr); + if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { + variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval)); + if (UNEXPECTED(variable_ptr == NULL)) { + zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied"); + goto assign_dim_error; + } + } else { + dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim); + } else { + variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim); + } + if (UNEXPECTED(variable_ptr == NULL)) { + goto assign_dim_error; + } + } + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -52103,7 +54417,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) { dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); zend_assign_to_object_dim(object_ptr, dim, value); @@ -52111,18 +54425,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { zend_throw_error(NULL, "[] operator not supported for strings"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); } else { dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - value = _get_zval_ptr_var_deref((opline+1)->op1.var, execute_data, &free_op_data); + value = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, (opline+1)->op1.var); zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); - zval_ptr_dtor_nogc(free_op_data); + } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { ZVAL_NEW_ARR(object_ptr); @@ -52134,7 +54447,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); assign_dim_error: - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } @@ -52148,95 +54461,244 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE - - zval *object_ptr; - zend_free_op free_op2; - zval *value; - zval *variable_ptr; - zval *dim; + zend_free_op free_op2, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { -try_assign_dim_array: - SEPARATE_ARRAY(object_ptr); - if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { - variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval)); - if (UNEXPECTED(variable_ptr == NULL)) { - zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied"); - goto assign_dim_error; - } - } else { - dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + + container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if (((IS_TMP_VAR|IS_VAR) != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim); + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); } - if (UNEXPECTED(variable_ptr == NULL)) { - goto assign_dim_error; + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } } } - value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - } else { - if (EXPECTED(Z_ISREF_P(object_ptr))) { - object_ptr = Z_REFVAL_P(object_ptr); - if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { - goto try_assign_dim_array; - } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op2; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + HANDLE_EXCEPTION(); } - if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) { - dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - zend_assign_to_object_dim(object_ptr, dim, value); + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } + property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { - if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { - zend_throw_error(NULL, "[] operator not supported for strings"); + container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } - HANDLE_EXCEPTION(); - } else { - dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - value = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, (opline+1)->op1.var); - zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if (((IS_TMP_VAR|IS_VAR) != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); } - } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - ZVAL_NEW_ARR(object_ptr); - zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0); - goto try_assign_dim_array; - } else { - if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) { - zend_error(E_WARNING, "Cannot use a scalar value as an array"); - } - dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); -assign_dim_error: - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } } } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; } - if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) { - zval_ptr_dtor_nogc(free_op2); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); } - /* assign_dim has two opcodes! */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); + zval_ptr_dtor_nogc(free_op2); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -61889,6 +64351,131 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV_HANDLER, ZEND_EXT_STMT_SPEC_HANDLER, ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER, ZEND_EXT_FCALL_END_SPEC_HANDLER, @@ -64256,84 +66843,79 @@ void zend_init_opcodes_handlers(void) 2257 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2282 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2307 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 4596, - 2332, - 2333, - 2334, - 2335, - 2336, - 2337 | SPEC_RULE_OP1, - 2342 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2367 | SPEC_RULE_OP1, - 2372 | SPEC_RULE_OP2, - 2377 | SPEC_RULE_OP1, - 2382 | SPEC_RULE_OP1, - 2387 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2412 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2437 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2462 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2487 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, - 2497 | SPEC_RULE_OP1, - 2502 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2527, - 2528 | SPEC_RULE_OP1, - 2533 | SPEC_RULE_OP1, - 2538 | SPEC_RULE_OP1, - 2543 | SPEC_RULE_OP1, - 2548 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2573 | SPEC_RULE_OP1, - 2578 | SPEC_RULE_OP1, - 2583 | SPEC_RULE_OP1, - 2588 | SPEC_RULE_OP2, - 2593 | SPEC_RULE_RETVAL, - 2595 | SPEC_RULE_RETVAL, - 2597 | SPEC_RULE_RETVAL, - 2599 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2624 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2649 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2674 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2699 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 2824, - 2825 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2850, - 2851 | SPEC_RULE_OP2, - 2856, - 2857 | SPEC_RULE_OP1, - 2862 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2887 | SPEC_RULE_OP2, - 2892 | SPEC_RULE_OP2, - 2897, - 2898 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 3023 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3048, - 3049, - 3050, - 3051 | SPEC_RULE_OP1, - 3056 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3081, - 3082, - 3083 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3108, - 3109, - 3110, - 3111 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3136 | SPEC_RULE_OP1, - 3141, - 3142, - 3143, - 3144, - 3145 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3170 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 3245 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3270 | SPEC_RULE_OP1, - 3275 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3300, - 3301 | SPEC_RULE_OP2, - 3306 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3331 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3356 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3381 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3406 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2332 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 2457, + 2458, + 2459, + 2460, + 2461, + 2462 | SPEC_RULE_OP1, + 2467 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2492 | SPEC_RULE_OP1, + 2497 | SPEC_RULE_OP2, + 2502 | SPEC_RULE_OP1, + 2507 | SPEC_RULE_OP1, + 2512 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2537 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2562 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2587 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2612 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, + 2622 | SPEC_RULE_OP1, + 2627 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2652, + 2653 | SPEC_RULE_OP1, + 2658 | SPEC_RULE_OP1, + 2663 | SPEC_RULE_OP1, + 2668 | SPEC_RULE_OP1, + 2673 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2698 | SPEC_RULE_OP1, + 2703 | SPEC_RULE_OP1, + 2708 | SPEC_RULE_OP1, + 2713 | SPEC_RULE_OP2, + 2718 | SPEC_RULE_RETVAL, + 2720 | SPEC_RULE_RETVAL, + 2722 | SPEC_RULE_RETVAL, + 2724 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2749 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2774 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2799 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2824 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 2949, + 2950 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2975, + 2976 | SPEC_RULE_OP2, + 2981, + 2982 | SPEC_RULE_OP1, + 2987 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3012 | SPEC_RULE_OP2, + 3017 | SPEC_RULE_OP2, + 3022, + 3023 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 3148 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3173, + 3174, + 3175, + 3176 | SPEC_RULE_OP1, + 3181 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3206, + 3207, + 3208 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3233, + 3234, + 3235, + 3236 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3261 | SPEC_RULE_OP1, + 3266, + 3267, + 3268, + 3269, + 3270 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3295 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 3370 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3395 | SPEC_RULE_OP1, + 3400 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3425, + 3426 | SPEC_RULE_OP2, 3431 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 3456 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 3481 | SPEC_RULE_OP1 | SPEC_RULE_OP2, @@ -64341,9 +66923,14 @@ void zend_init_opcodes_handlers(void) 3531 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 3556 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 3581 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 4596, 3606 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 4596 + 3631 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3656 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3681 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3706 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 4721, + 3731 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 4721 }; zend_opcode_handlers = labels; zend_handlers_count = sizeof(labels) / sizeof(void*); @@ -64450,7 +67037,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3631 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3756 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64458,7 +67045,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3656 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3781 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64466,7 +67053,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3681 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3806 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64477,17 +67064,17 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3706 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3831 | 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 = 3731 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3856 | 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 = 3756 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3881 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_MUL: @@ -64495,7 +67082,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3781 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3906 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64503,7 +67090,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3806 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3931 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64511,7 +67098,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3831 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3956 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64522,7 +67109,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3856 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3981 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64530,7 +67117,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3931 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4056 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64541,7 +67128,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4006 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4131 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64549,7 +67136,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4081 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4206 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64560,12 +67147,12 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4156 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4281 | 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 = 4231 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4356 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_IS_SMALLER_OR_EQUAL: @@ -64573,70 +67160,70 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4306 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4431 | 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 = 4381 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4506 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_QM_ASSIGN: if ((op1_info == MAY_BE_DOUBLE)) { - spec = 4546 | SPEC_RULE_OP1; + spec = 4671 | SPEC_RULE_OP1; } else if ((!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE))))) { - spec = 4551 | SPEC_RULE_OP1; + spec = 4676 | SPEC_RULE_OP1; } break; case ZEND_PRE_INC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4456 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4581 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4466 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4591 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4476 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4601 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } break; case ZEND_PRE_DEC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4486 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4611 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4496 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4621 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4506 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4631 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } break; case ZEND_POST_INC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4516 | SPEC_RULE_OP1; + spec = 4641 | SPEC_RULE_OP1; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4521 | SPEC_RULE_OP1; + spec = 4646 | SPEC_RULE_OP1; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4526 | SPEC_RULE_OP1; + spec = 4651 | SPEC_RULE_OP1; } break; case ZEND_POST_DEC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4531 | SPEC_RULE_OP1; + spec = 4656 | SPEC_RULE_OP1; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4536 | SPEC_RULE_OP1; + spec = 4661 | SPEC_RULE_OP1; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4541 | SPEC_RULE_OP1; + spec = 4666 | SPEC_RULE_OP1; } break; case ZEND_SEND_VAR_EX: if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4586 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG; + spec = 4711 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG; } break; case ZEND_FETCH_DIM_R: if ((!(op2_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)))) { - spec = 4556 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4681 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_SEND_VAR: if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4581 | SPEC_RULE_OP1; + spec = 4706 | SPEC_RULE_OP1; } break; default: diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index 0d21e33b1c80..b231f97f8729 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -576,6 +576,17 @@ "TMPVARCV" => "???", ); +$op_data_get_zval_ptr_ptr = array( + "ANY" => "get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data, \\1)", + "TMP" => "NULL", + "VAR" => "_get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data)", + "CONST" => "NULL", + "UNUSED" => "NULL", + "CV" => "_get_zval_ptr_cv_\\1(execute_data, (opline+1)->op1.var)", + "TMPVAR" => "???", + "TMPVARCV" => "???", +); + $op_data_free_op = array( "ANY" => "FREE_OP(free_op_data)", "TMP" => "zval_ptr_dtor_nogc(free_op_data)", @@ -587,6 +598,17 @@ "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))", @@ -642,9 +664,11 @@ function helper_name($name, $spec, $op1, $op2) { return $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2]; } -function opcode_name($name, $spec, $op1, $op2) { +function opcode_name($name, $spec, $op1, $op2, $extra_spec) { global $prefix, $opnames, $opcodes; + $extra = ""; + if (isset($opnames[$name])) { $opcode = $opcodes[$opnames[$name]]; // If we haven't helper with specified spicialized operands then @@ -657,8 +681,12 @@ function opcode_name($name, $spec, $op1, $op2) { isset($opcode["op2"]["ANY"])) { $op2 = "ANY"; } + /* forward common specs (e.g. in ZEND_VM_DISPATCH_TO_HANDLER) */ + if (isset($extra_spec, $opcode["spec"])) { + $extra = extra_spec_name(array_intersect_key($extra_spec, $opcode["spec"])); + } } - return $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2]; + return $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2].$extra; } // Generates code for opcode handler or helper @@ -676,8 +704,9 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp $op1_free, $op2_free, $op1_free_unfetched, $op2_free_unfetched, $op1_free_op, $op2_free_op, $op1_free_op_if_var, $op2_free_op_if_var, $op1_free_op_var_ptr, $op2_free_op_var_ptr, $prefix, - $op_data_type, $op_data_get_zval_ptr, $op_data_get_zval_ptr_deref, - $op_data_free_op, $op_data_free_unfetched; + $op_data_type, $op_data_get_zval_ptr, + $op_data_get_zval_ptr_deref, $op_data_get_zval_ptr_ptr, + $op_data_free_op, $op_data_free_op_var_ptr, $op_data_free_unfetched; // Specializing $code = preg_replace( @@ -727,7 +756,9 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp "/OP_DATA_TYPE/", "/GET_OP_DATA_ZVAL_PTR\(([^)]*)\)/", "/GET_OP_DATA_ZVAL_PTR_DEREF\(([^)]*)\)/", + "/GET_OP_DATA_ZVAL_PTR_PTR\(([^)]*)\)/", "/FREE_OP_DATA\(\)/", + "/FREE_OP_DATA_VAR_PTR\(\)/", "/FREE_UNFETCHED_OP_DATA\(\)/", "/RETURN_VALUE_USED\(opline\)/", "/arg_num <= MAX_ARG_FLAG_NUM/", @@ -782,7 +813,9 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp $op_data_type[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], $op_data_get_zval_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], $op_data_get_zval_ptr_deref[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], + $op_data_get_zval_ptr_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], $op_data_free_op[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], + $op_data_free_op_var_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], $op_data_free_unfetched[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], isset($extra_spec['RETVAL']) ? $extra_spec['RETVAL'] : "RETURN_VALUE_USED(opline)", isset($extra_spec['QUICK_ARG']) ? $extra_spec['QUICK_ARG'] : "arg_num <= MAX_ARG_FLAG_NUM", @@ -816,11 +849,11 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp "/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) { + 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))"; + return "ZEND_VM_TAIL_CALL(" . opcode_name($matches[1], $spec, $op1, $op2, $extra_spec) . "_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))"; } else { // ZEND_VM_DISPATCH_TO_HELPER if (isset($matches[2])) { @@ -840,11 +873,11 @@ function($matches) use ($spec, $prefix, $op1, $op2) { "/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) { + 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"; + return "goto " . opcode_name($matches[1], $spec, $op1, $op2, $extra_spec) . "_LABEL"; } else { // ZEND_VM_DISPATCH_TO_HELPER if (isset($matches[2])) { @@ -864,11 +897,11 @@ function($matches) use ($spec, $prefix, $op1, $op2) { "/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) { + 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) . "_HANDLER"; + return "goto " . opcode_name($matches[1], $spec, $op1, $op2, $extra_spec) . "_HANDLER"; } else { // ZEND_VM_DISPATCH_TO_HELPER if (isset($matches[2])) { diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 6ad01950d5b6..cd163074aca9 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -122,7 +122,7 @@ static const char *zend_vm_opcodes_names[187] = { "ZEND_FETCH_OBJ_UNSET", "ZEND_FETCH_LIST", "ZEND_FETCH_CONSTANT", - NULL, + "ZEND_ASSIGN_OBJ_REF", "ZEND_EXT_STMT", "ZEND_EXT_FCALL_BEGIN", "ZEND_EXT_FCALL_END", @@ -312,7 +312,7 @@ static uint32_t zend_vm_opcodes_flags[187] = { 0x00000751, 0x00000707, 0x06000301, - 0x00000000, + 0x0b000751, 0x00000000, 0x00000000, 0x00000000, diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index 14444977fae3..5b351bcba4a2 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -168,6 +168,7 @@ END_EXTERN_C() #define ZEND_FETCH_OBJ_UNSET 97 #define ZEND_FETCH_LIST 98 #define ZEND_FETCH_CONSTANT 99 +#define ZEND_ASSIGN_OBJ_REF 100 #define ZEND_EXT_STMT 101 #define ZEND_EXT_FCALL_BEGIN 102 #define ZEND_EXT_FCALL_END 103 diff --git a/ext/intl/formatter/formatter_parse.c b/ext/intl/formatter/formatter_parse.c index 37b28ae55835..9b9705f7b0f8 100644 --- a/ext/intl/formatter/formatter_parse.c +++ b/ext/intl/formatter/formatter_parse.c @@ -51,7 +51,7 @@ PHP_FUNCTION( numfmt_parse ) FORMATTER_METHOD_INIT_VARS; /* Parse parameters. */ - if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Os|lz/!", + if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Os|ll!", &object, NumberFormatter_ce_ptr, &str, &str_len, &type, &zposition ) == FAILURE ) { intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, @@ -60,6 +60,11 @@ PHP_FUNCTION( numfmt_parse ) RETURN_FALSE; } + if(zposition) { + position = (int32_t)Z_LVAL_P( zposition ); + position_p = &position; + } + /* Fetch the object. */ FORMATTER_METHOD_FETCH_OBJECT; @@ -67,13 +72,6 @@ PHP_FUNCTION( numfmt_parse ) intl_convert_utf8_to_utf16(&sstr, &sstr_len, str, str_len, &INTL_DATA_ERROR_CODE(nfo)); INTL_METHOD_CHECK_STATUS( nfo, "String conversion to UTF-16 failed" ); - if(zposition) { - ZVAL_DEREF(zposition); - convert_to_long(zposition); - position = (int32_t)Z_LVAL_P( zposition ); - position_p = &position; - } - #if ICU_LOCALE_BUG && defined(LC_NUMERIC) /* need to copy here since setlocale may change it later */ oldlocale = estrdup(setlocale(LC_NUMERIC, NULL)); diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index ba616dff2325..773239eb5488 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -4299,14 +4299,13 @@ PHP_FUNCTION(getopt) int optname_len = 0; opt_struct *opts, *orig_opts; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|az/", &options, &options_len, &p_longopts, &zoptind) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|az", &options, &options_len, &p_longopts, &zoptind) == FAILURE) { RETURN_FALSE; } /* Init zoptind to 1 */ if (zoptind) { - zval_dtor(zoptind); - ZVAL_LONG(zoptind, 1); + ZEND_TRY_ASSIGN_LONG(zoptind, 1); } /* Get argv from the global symbol table. We calculate argc ourselves @@ -4452,7 +4451,7 @@ PHP_FUNCTION(getopt) /* Set zoptind to php_optind */ if (zoptind) { - ZVAL_LONG(zoptind, php_optind); + ZEND_TRY_ASSIGN_LONG(zoptind, php_optind); } free_longopts(orig_opts); diff --git a/ext/standard/dns.c b/ext/standard/dns.c index de40649e696c..1be28bad5c42 100644 --- a/ext/standard/dns.c +++ b/ext/standard/dns.c @@ -785,7 +785,7 @@ PHP_FUNCTION(dns_get_record) int type, first_query = 1, store_results = 1; zend_bool raw = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lz!z!b", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lt!t!b", &hostname, &hostname_len, &type_param, &authns, &addtl, &raw) == FAILURE) { return; } @@ -1013,7 +1013,7 @@ PHP_FUNCTION(dns_get_mx) struct __res_state *handle = &state; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/|z/", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "st/|t/", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { return; } diff --git a/ext/standard/exec.c b/ext/standard/exec.c index d541ff6b4c09..4cb363a9a122 100644 --- a/ext/standard/exec.c +++ b/ext/standard/exec.c @@ -214,11 +214,11 @@ static void php_exec_ex(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */ int ret; if (mode) { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z/", &cmd, &cmd_len, &ret_code) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|t", &cmd, &cmd_len, &ret_code) == FAILURE) { RETURN_FALSE; } } else { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z/z/", &cmd, &cmd_len, &ret_array, &ret_code) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|tz", &cmd, &cmd_len, &ret_array, &ret_code) == FAILURE) { RETURN_FALSE; } } @@ -241,8 +241,7 @@ static void php_exec_ex(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */ ret = php_exec(2, cmd, ret_array, return_value); } if (ret_code) { - zval_dtor(ret_code); - ZVAL_LONG(ret_code, ret); + ZEND_TRY_ASSIGN_LONG(ret_code, ret); } } /* }}} */ diff --git a/ext/standard/file.c b/ext/standard/file.c index c75d2d3fa0d7..cb81072f0f41 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -341,7 +341,7 @@ PHP_FUNCTION(flock) php_stream *stream; zend_long operation = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|z/", &res, &operation, &wouldblock) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|z", &res, &operation, &wouldblock) == FAILURE) { return; } @@ -354,15 +354,14 @@ PHP_FUNCTION(flock) } if (wouldblock) { - zval_dtor(wouldblock); - ZVAL_LONG(wouldblock, 0); + ZEND_TRY_ASSIGN_LONG(wouldblock, 0); } /* flock_values contains all possible actions if (operation & 4) we won't block on the lock */ act = flock_values[act - 1] | (operation & PHP_LOCK_NB ? LOCK_NB : 0); if (php_stream_lock(stream, act)) { if (operation && errno == EWOULDBLOCK && wouldblock) { - ZVAL_LONG(wouldblock, 1); + ZEND_TRY_ASSIGN_LONG(wouldblock, 1); } RETURN_FALSE; } diff --git a/ext/standard/fsock.c b/ext/standard/fsock.c index 675e1154a967..561d259d0681 100644 --- a/ext/standard/fsock.c +++ b/ext/standard/fsock.c @@ -51,7 +51,7 @@ static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent) RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lz/z/d", &host, &host_len, &port, &zerrno, &zerrstr, &timeout) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lzzd", &host, &host_len, &port, &zerrno, &zerrstr, &timeout) == FAILURE) { RETURN_FALSE; } @@ -99,10 +99,9 @@ static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent) efree(hashkey); } - if (stream == NULL) { + if (stream == NULL) { if (zerrno) { - zval_dtor(zerrno); - ZVAL_LONG(zerrno, err); + ZEND_TRY_ASSIGN_LONG(zerrno, err); } if (zerrstr && errstr) { /* no need to dup; we need to efree buf anyway */ diff --git a/ext/standard/head.c b/ext/standard/head.c index eac9159ab922..bf04f986f3b2 100644 --- a/ext/standard/head.c +++ b/ext/standard/head.c @@ -234,7 +234,7 @@ PHP_FUNCTION(headers_sent) const char *file=""; int line=0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "|z/z/", &arg1, &arg2) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|zz", &arg1, &arg2) == FAILURE) return; if (SG(headers_sent)) { @@ -244,14 +244,12 @@ PHP_FUNCTION(headers_sent) switch(ZEND_NUM_ARGS()) { case 2: - zval_dtor(arg2); - ZVAL_LONG(arg2, line); + ZEND_TRY_ASSIGN_LONG(arg2, line); case 1: - zval_dtor(arg1); if (file) { - ZVAL_STRING(arg1, file); + ZEND_TRY_ASSIGN_STRING(arg1, file); } else { - ZVAL_EMPTY_STRING(arg1); + ZEND_TRY_ASSIGN_EMPTY_STRING(arg1); } break; } diff --git a/ext/standard/image.c b/ext/standard/image.c index 4fb8298f7607..90f2bda27024 100644 --- a/ext/standard/image.c +++ b/ext/standard/image.c @@ -1470,7 +1470,7 @@ static void php_getimagesize_from_any(INTERNAL_FUNCTION_PARAMETERS, int mode) { size_t input_len; const int argc = ZEND_NUM_ARGS(); - if (zend_parse_parameters(argc, "s|z/", &input, &input_len, &info) == FAILURE) { + if (zend_parse_parameters(argc, "s|t", &input, &input_len, &info) == FAILURE) { return; } diff --git a/ext/standard/proc_open.c b/ext/standard/proc_open.c index 95803c9bbd4a..d9475d11f61d 100644 --- a/ext/standard/proc_open.c +++ b/ext/standard/proc_open.c @@ -458,7 +458,7 @@ PHP_FUNCTION(proc_open) php_file_descriptor_t slave_pty = -1; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "saz/|s!a!a!", &command, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sat|s!a!a!", &command, &command_len, &descriptorspec, &pipes, &cwd, &cwd_len, &environment, &other_options) == FAILURE) { RETURN_FALSE; diff --git a/ext/standard/scanf.c b/ext/standard/scanf.c index 703a125bb453..b5109ae10c26 100644 --- a/ext/standard/scanf.c +++ b/ext/standard/scanf.c @@ -741,9 +741,8 @@ PHPAPI int php_sscanf_internal( char *string, char *format, if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_LONG(current, (zend_long)(string - baseString) ); + current = args + objIndex++; + ZEND_TRY_ASSIGN_LONG(current, (zend_long) (string - baseString)); } else { add_index_long(return_value, objIndex++, string - baseString); } @@ -860,9 +859,8 @@ PHPAPI int php_sscanf_internal( char *string, char *format, if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_STRINGL(current, string, end-string); + current = args + objIndex++; + ZEND_TRY_ASSIGN_STRINGL(current, string, end - string); } else { add_index_stringl(return_value, objIndex++, string, end-string); } @@ -901,9 +899,8 @@ PHPAPI int php_sscanf_internal( char *string, char *format, if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_STRINGL(current, string, end-string); + current = args + objIndex++; + ZEND_TRY_ASSIGN_STRINGL(current, string, end - string); } else { add_index_stringl(return_value, objIndex++, string, end-string); } @@ -922,7 +919,7 @@ PHPAPI int php_sscanf_internal( char *string, char *format, char __buf[2]; __buf[0] = sch; __buf[1] = '\0';; - current = args[objIndex++]; + current = args + objIndex++; zval_dtor(*current); ZVAL_STRINGL( *current, __buf, 1); } else { @@ -1054,10 +1051,9 @@ PHPAPI int php_sscanf_internal( char *string, char *format, if (numVars && objIndex >= argCount) { break; } else if (numVars) { - /* change passed value type to string */ - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_STRING(current, buf); + /* change passed value type to string */ + current = args + objIndex++; + ZEND_TRY_ASSIGN_STRING(current, buf); } else { add_index_string(return_value, objIndex++, buf); } @@ -1065,9 +1061,8 @@ PHPAPI int php_sscanf_internal( char *string, char *format, if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_LONG(current, value); + current = args + objIndex++; + ZEND_TRY_ASSIGN_LONG(current, value); } else { add_index_long(return_value, objIndex++, value); } @@ -1170,9 +1165,8 @@ PHPAPI int php_sscanf_internal( char *string, char *format, if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_DOUBLE(current, dvalue); + current = args + objIndex++; + ZEND_TRY_ASSIGN_DOUBLE(current, dvalue); } else { add_index_double(return_value, objIndex++, dvalue ); } diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index 5979c8cccb35..63c19c11e017 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -102,7 +102,7 @@ PHP_FUNCTION(stream_socket_client) RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|z/z/dlr", &host, &zerrno, &zerrstr, &timeout, &flags, &zcontext) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|zzdlr", &host, &zerrno, &zerrstr, &timeout, &flags, &zcontext) == FAILURE) { RETURN_FALSE; } @@ -121,13 +121,11 @@ PHP_FUNCTION(stream_socket_client) tv.tv_sec = conv / 1000000; tv.tv_usec = conv % 1000000; #endif - if (zerrno) { - zval_dtor(zerrno); - ZVAL_LONG(zerrno, 0); + if (zerrno) { + ZEND_TRY_ASSIGN_LONG(zerrno, 0); } if (zerrstr) { - zval_dtor(zerrstr); - ZVAL_EMPTY_STRING(zerrstr); + ZEND_TRY_ASSIGN_EMPTY_STRING(zerrstr); } stream = php_stream_xport_create(ZSTR_VAL(host), ZSTR_LEN(host), REPORT_ERRORS, @@ -148,14 +146,12 @@ PHP_FUNCTION(stream_socket_client) efree(hashkey); } - if (stream == NULL) { + if (stream == NULL) { if (zerrno) { - zval_dtor(zerrno); - ZVAL_LONG(zerrno, err); + ZEND_TRY_ASSIGN_LONG(zerrno, err); } if (zerrstr && errstr) { - zval_dtor(zerrstr); - ZVAL_STR(zerrstr, errstr); + ZEND_TRY_ASSIGN_STR(zerrstr, errstr); } else if (errstr) { zend_string_release(errstr); } @@ -186,7 +182,7 @@ PHP_FUNCTION(stream_socket_server) RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z/z/lr", &host, &host_len, &zerrno, &zerrstr, &flags, &zcontext) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|zzlr", &host, &host_len, &zerrno, &zerrstr, &flags, &zcontext) == FAILURE) { RETURN_FALSE; } @@ -196,13 +192,11 @@ PHP_FUNCTION(stream_socket_server) GC_REFCOUNT(context->res)++; } - if (zerrno) { - zval_dtor(zerrno); - ZVAL_LONG(zerrno, 0); + if (zerrno) { + ZEND_TRY_ASSIGN_LONG(zerrno, 0); } if (zerrstr) { - zval_dtor(zerrstr); - ZVAL_EMPTY_STRING(zerrstr); + ZEND_TRY_ASSIGN_EMPTY_STRING(zerrstr); } stream = php_stream_xport_create(host, host_len, REPORT_ERRORS, @@ -213,14 +207,12 @@ PHP_FUNCTION(stream_socket_server) php_error_docref(NULL, E_WARNING, "unable to connect to %s (%s)", host, errstr == NULL ? "Unknown error" : ZSTR_VAL(errstr)); } - if (stream == NULL) { + if (stream == NULL) { if (zerrno) { - zval_dtor(zerrno); - ZVAL_LONG(zerrno, err); + ZEND_TRY_ASSIGN_LONG(zerrno, err); } if (zerrstr && errstr) { - zval_dtor(zerrstr); - ZVAL_STR(zerrstr, errstr); + ZEND_TRY_ASSIGN_STR(zerrstr, errstr); } else if (errstr) { zend_string_release(errstr); } @@ -252,7 +244,7 @@ PHP_FUNCTION(stream_socket_accept) Z_PARAM_RESOURCE(zstream) Z_PARAM_OPTIONAL Z_PARAM_DOUBLE(timeout) - Z_PARAM_ZVAL_EX(zpeername, 0, 1) + Z_PARAM_ZVAL(zpeername) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); php_stream_from_zval(stream, zstream); @@ -266,10 +258,6 @@ PHP_FUNCTION(stream_socket_accept) tv.tv_sec = conv / 1000000; tv.tv_usec = conv % 1000000; #endif - if (zpeername) { - zval_dtor(zpeername); - ZVAL_NULL(zpeername); - } if (0 == php_stream_xport_accept(stream, &clistream, zpeername ? &peername : NULL, @@ -278,7 +266,7 @@ PHP_FUNCTION(stream_socket_accept) ) && clistream) { if (peername) { - ZVAL_STR(zpeername, peername); + ZEND_TRY_ASSIGN_STR(zpeername, peername); } php_stream_to_zval(clistream, return_value); } else { @@ -360,15 +348,14 @@ PHP_FUNCTION(stream_socket_recvfrom) zend_long flags = 0; int recvd; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|lz/", &zstream, &to_read, &flags, &zremote) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|lz", &zstream, &to_read, &flags, &zremote) == FAILURE) { RETURN_FALSE; } php_stream_from_zval(stream, zstream); if (zremote) { - zval_dtor(zremote); - ZVAL_NULL(zremote); + ZEND_TRY_ASSIGN_NULL(zremote); } if (to_read <= 0) { @@ -384,7 +371,7 @@ PHP_FUNCTION(stream_socket_recvfrom) if (recvd >= 0) { if (zremote && remote_addr) { - ZVAL_STR(zremote, remote_addr); + ZEND_TRY_ASSIGN_STR(zremote, remote_addr); } ZSTR_VAL(read_buf)[recvd] = '\0'; ZSTR_LEN(read_buf) = recvd; diff --git a/ext/standard/string.c b/ext/standard/string.c index 4389e1070266..9ea7955aa530 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -3531,17 +3531,13 @@ PHP_FUNCTION(similar_text) int ac = ZEND_NUM_ARGS(); size_t sim; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "SS|z/", &t1, &t2, &percent) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "SS|z", &t1, &t2, &percent) == FAILURE) { return; } - if (ac > 2) { - convert_to_double_ex(percent); - } - if (ZSTR_LEN(t1) + ZSTR_LEN(t2) == 0) { if (ac > 2) { - Z_DVAL_P(percent) = 0; + ZEND_TRY_ASSIGN_DOUBLE(percent, 0); } RETURN_LONG(0); @@ -3550,7 +3546,7 @@ PHP_FUNCTION(similar_text) sim = php_similar_char(ZSTR_VAL(t1), ZSTR_LEN(t1), ZSTR_VAL(t2), ZSTR_LEN(t2)); if (ac > 2) { - Z_DVAL_P(percent) = sim * 200.0 / (ZSTR_LEN(t1) + ZSTR_LEN(t2)); + ZEND_TRY_ASSIGN_DOUBLE(percent, sim * 200.0 / (ZSTR_LEN(t1) + ZSTR_LEN(t2))); } RETURN_LONG(sim); @@ -4047,7 +4043,7 @@ static void php_str_replace_common(INTERNAL_FUNCTION_PARAMETERS, int case_sensit Z_PARAM_ZVAL(replace) Z_PARAM_ZVAL(subject) Z_PARAM_OPTIONAL - Z_PARAM_ZVAL_EX(zcount, 0, 1) + Z_PARAM_ZVAL(zcount) ZEND_PARSE_PARAMETERS_END(); /* Make sure we're dealing with strings and do the replacement. */ @@ -4084,8 +4080,7 @@ static void php_str_replace_common(INTERNAL_FUNCTION_PARAMETERS, int case_sensit count = php_str_replace_in_subject(search, replace, subject, return_value, case_sensitivity); } if (argc > 3) { - zval_ptr_dtor(zcount); - ZVAL_LONG(zcount, count); + ZEND_TRY_ASSIGN_LONG(zcount, count); } } /* }}} */ @@ -4503,7 +4498,7 @@ PHP_FUNCTION(parse_str) char *res = NULL; size_t arglen; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z/", &arg, &arglen, &arrayArg) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|t", &arg, &arglen, &arrayArg) == FAILURE) { return; } From 0efa68b0dc0bfc4344dd8155186b393a5619adb9 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 13 Nov 2016 20:36:23 +0100 Subject: [PATCH 200/369] Fix make test --- Zend/zend_API.c | 3 ++- Zend/zend_types.h | 1 + Zend/zend_vm_def.h | 1 + Zend/zend_vm_execute.h | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 70449de2d743..f7aaedd6db45 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -645,8 +645,9 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons return "array"; } - zend_parse_arg_zval_deref(real_arg, p, check_null); + zend_parse_arg_zval_deref(arg, p, check_null); } + break; case 'o': { diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 736693c931e4..723958e7dcf0 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -759,6 +759,7 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { GC_REFCOUNT(_ref) = 1; \ GC_TYPE_INFO(_ref) = IS_REFERENCE; \ ZVAL_COPY_VALUE(&_ref->val, r); \ + _ref->type = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ } while (0) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7d8a9c2aeb82..ce51d560794d 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -8089,6 +8089,7 @@ ZEND_VM_C_LABEL(check_indirect): GC_REFCOUNT(ref) = 2; GC_TYPE_INFO(ref) = IS_REFERENCE; ZVAL_COPY_VALUE(&ref->val, value); + ref->type = NULL; Z_REF_P(value) = ref; Z_TYPE_INFO_P(value) = IS_REFERENCE_EX; } else { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 8f7e318594f4..a397bb802e4a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -43941,6 +43941,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_GLOBAL_SPEC_CV_CONST_HAND GC_REFCOUNT(ref) = 2; GC_TYPE_INFO(ref) = IS_REFERENCE; ZVAL_COPY_VALUE(&ref->val, value); + ref->type = NULL; Z_REF_P(value) = ref; Z_TYPE_INFO_P(value) = IS_REFERENCE_EX; } else { From a75e03a51948b33e3c87c75c24297c0729545866 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 13 Nov 2016 21:58:39 +0100 Subject: [PATCH 201/369] Take properly care of cases where the by-ref value is *consumed* first --- Zend/zend_API.c | 137 ++++++++++++++++++++++++++++++++++++++++++---- Zend/zend_API.h | 55 +++++++------------ ext/curl/multi.c | 3 +- ext/pcntl/pcntl.c | 5 +- 4 files changed, 148 insertions(+), 52 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index f7aaedd6db45..0df34928ef36 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -531,7 +531,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons is_null = va_arg(*va, zend_bool *); } - if (!zend_parse_arg_long(arg, p, is_null, check_null, c == 'L', ref_type)) { + if (!zend_parse_arg_long(arg, p, is_null, check_null, c == 'L')) { return "integer"; } } @@ -546,7 +546,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons is_null = va_arg(*va, zend_bool *); } - if (!zend_parse_arg_double(arg, p, is_null, check_null, ref_type)) { + if (!zend_parse_arg_double(arg, p, is_null, check_null)) { return "float"; } } @@ -556,7 +556,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons { char **p = va_arg(*va, char **); size_t *pl = va_arg(*va, size_t *); - if (!zend_parse_arg_string(arg, p, pl, check_null, ref_type)) { + if (!zend_parse_arg_string(arg, p, pl, check_null)) { return "string"; } } @@ -566,7 +566,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons { char **p = va_arg(*va, char **); size_t *pl = va_arg(*va, size_t *); - if (!zend_parse_arg_path(arg, p, pl, check_null, ref_type)) { + if (!zend_parse_arg_path(arg, p, pl, check_null)) { return "a valid path"; } } @@ -575,7 +575,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons case 'P': { zend_string **str = va_arg(*va, zend_string **); - if (!zend_parse_arg_path_str(arg, str, check_null, ref_type)) { + if (!zend_parse_arg_path_str(arg, str, check_null)) { return "a valid path"; } } @@ -584,7 +584,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons case 'S': { zend_string **str = va_arg(*va, zend_string **); - if (!zend_parse_arg_str(arg, str, check_null, ref_type)) { + if (!zend_parse_arg_str(arg, str, check_null)) { return "string"; } } @@ -599,7 +599,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons is_null = va_arg(*va, zend_bool *); } - if (!zend_parse_arg_bool(arg, p, is_null, check_null, ref_type)) { + if (!zend_parse_arg_bool(arg, p, is_null, check_null)) { return "boolean"; } } @@ -749,10 +749,122 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons break; case 'Z': - /* 'Z' iz not supported anymore and should be replaced with 'z' */ - ZEND_ASSERT(c != 'Z'); - default: - return "unknown"; + { + if (Z_TYPE_P(arg) == IS_NULL) { + if (!check_null) { + return "a non-null value"; + } + + if (ref_type) { + zend_uchar type; + char *expected; + switch (*spec_walk) { + case 'l': + case 'L': + type = IS_LONG; + expected = "integer"; + break; + case 'd': + type = IS_DOUBLE; + expected = "double"; + break; + case 's': + case 'S': + type = IS_STRING; + expected = "string"; + break; + case 'p': + case 'P': + type = IS_STRING; + expected = "a valid path"; + break; + case 'b': + type = _IS_BOOL; + expected = "boolean"; + break; + + default: + return "unknown"; + } + if (!zend_verify_ref_type_assignable(ref_type, type)) { + return expected; + } + } + } else { + switch (*spec_walk) { + case 'l': + if (Z_TYPE_P(arg) != IS_LONG) { + zend_long l; + if (ref_type || !zend_parse_arg_long_slow(arg, &l)) { + return "integer"; + } + ZVAL_LONG(arg, l); + } + break; + + case 'L': + if (Z_TYPE_P(arg) != IS_LONG) { + zend_long l; + if (ref_type || !zend_parse_arg_long_cap_slow(arg, &l)) { + return "integer"; + } + ZVAL_LONG(arg, l); + } + break; + + case 'd': + if (Z_TYPE_P(arg) != IS_DOUBLE) { + double d; + if (ref_type || !zend_parse_arg_double_slow(arg, &d)) { + return "double"; + } + ZVAL_DOUBLE(arg, d); + } + break; + + case 's': + case 'S': + if (Z_TYPE_P(arg) != IS_STRING) { + zend_string *s; + if (ref_type || !zend_parse_arg_str_slow(arg, &s)) { + return "string"; + } + ZVAL_STR(arg, s); + } + break; + + case 'p': + case 'P': + if (Z_TYPE_P(arg) != IS_STRING) { + zend_string *s; + if (ref_type || !zend_parse_arg_path_str(arg, &s, 0)) { + return "a valid path"; + } + ZVAL_STR(arg, s); + } else if (UNEXPECTED(CHECK_NULL_PATH(Z_STRVAL_P(arg), Z_STRLEN_P(arg)))) { + return "a valid path"; + } + break; + + case 'b': + if (Z_TYPE_P(arg) != IS_TRUE && Z_TYPE_P(arg) != IS_FALSE) { + zend_bool b; + if (ref_type || !zend_parse_arg_bool_slow(arg, &b)) { + return "boolean"; + } + ZVAL_BOOL(arg, b); + } + break; + + default: + return "unknown"; + } + } + + *((zval **) va_arg(*va, zval **)) = arg; + ++spec_walk; + } + break; } *spec = spec_walk; @@ -836,7 +948,7 @@ static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va, case 's': case 'b': case 'r': case 'a': case 'o': case 'O': - case 'z': case 'Z': + case 'z': case 'C': case 'h': case 'f': case 'A': case 'H': case 'p': @@ -851,6 +963,7 @@ static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va, case '/': case '!': + case 'Z': /* Pass */ break; diff --git a/Zend/zend_API.h b/Zend/zend_API.h index de6a86b75e96..f6802f5940b8 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -762,7 +762,6 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in zval *_real_arg, *_arg = NULL; \ zend_expected_type _expected_type = IS_UNDEF; \ char *_error = NULL; \ - void *_ref_type; \ zend_bool _dummy; \ zend_bool _optional = 0; \ int error_code = ZPP_ERROR_OK; \ @@ -771,7 +770,6 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in ((void)_arg); \ ((void)_expected_type); \ ((void)_error); \ - ((void)_ref_type); \ ((void)_dummy); \ ((void)_optional); \ \ @@ -819,12 +817,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in } \ _real_arg++; \ _arg = _real_arg; \ - if (UNEXPECTED(Z_ISREF_P(_arg))) { \ - _ref_type = Z_REF_P(_arg)->type; \ - _arg = Z_REFVAL_P(_arg); \ - } else { \ - _ref_type = NULL; \ - } \ + ZVAL_DEREF(_arg); \ if (separate) { \ SEPARATE_ZVAL_NOREF(_arg); \ } @@ -860,7 +853,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "b" */ #define Z_PARAM_BOOL_EX(dest, is_null, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_bool(_arg, &dest, &is_null, check_null, _ref_type))) { \ + if (UNEXPECTED(!zend_parse_arg_bool(_arg, &dest, &is_null, check_null))) { \ _expected_type = Z_EXPECTED_BOOL; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -883,7 +876,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "d" */ #define Z_PARAM_DOUBLE_EX(dest, is_null, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_double(_arg, &dest, &is_null, check_null, _ref_type))) { \ + if (UNEXPECTED(!zend_parse_arg_double(_arg, &dest, &is_null, check_null))) { \ _expected_type = Z_EXPECTED_DOUBLE; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -938,7 +931,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "l" */ #define Z_PARAM_LONG_EX(dest, is_null, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 0, _ref_type))) { \ + if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 0))) { \ _expected_type = Z_EXPECTED_LONG; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -950,7 +943,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "L" */ #define Z_PARAM_STRICT_LONG_EX(dest, is_null, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 1, _ref_type))) { \ + if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 1))) { \ _expected_type = Z_EXPECTED_LONG; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -992,7 +985,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "p" */ #define Z_PARAM_PATH_EX(dest, dest_len, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_path(_arg, &dest, &dest_len, check_null, _ref_type))) { \ + if (UNEXPECTED(!zend_parse_arg_path(_arg, &dest, &dest_len, check_null))) { \ _expected_type = Z_EXPECTED_PATH; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -1004,7 +997,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "P" */ #define Z_PARAM_PATH_STR_EX(dest, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_path_str(_arg, &dest, check_null, _ref_type))) { \ + if (UNEXPECTED(!zend_parse_arg_path_str(_arg, &dest, check_null))) { \ _expected_type = Z_EXPECTED_PATH; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -1028,7 +1021,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "s" */ #define Z_PARAM_STRING_EX(dest, dest_len, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_string(_arg, &dest, &dest_len, check_null, _ref_type))) { \ + if (UNEXPECTED(!zend_parse_arg_string(_arg, &dest, &dest_len, check_null))) { \ _expected_type = Z_EXPECTED_STRING; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -1040,7 +1033,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "S" */ #define Z_PARAM_STR_EX(dest, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_str(_arg, &dest, check_null, _ref_type))) { \ + if (UNEXPECTED(!zend_parse_arg_str(_arg, &dest, check_null))) { \ _expected_type = Z_EXPECTED_STRING; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -1052,7 +1045,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "t" */ #define Z_PARAM_ARRAY_ASSIGNABLE_EX(dest, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (_ref_type && (((uintptr_t) _ref_type) >> 1) != IS_ARRAY) { \ + if (Z_ISREF_P(_real_arg) && Z_REFTYPE_P(_real_arg) && (((uintptr_t) Z_REFTYPE_P(_real_arg)) >> 1) != IS_ARRAY) { \ _expected_type = Z_EXPECTED_ARRAY; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -1120,7 +1113,7 @@ ZEND_API int ZEND_FASTCALL zend_parse_arg_double_weak(zval *arg, double *dest); ZEND_API int ZEND_FASTCALL zend_parse_arg_str_slow(zval *arg, zend_string **dest); ZEND_API int ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, zend_string **dest); -static zend_always_inline int zend_parse_arg_bool(zval *arg, zend_bool *dest, zend_bool *is_null, int check_null, void *ref_type) +static zend_always_inline int zend_parse_arg_bool(zval *arg, zend_bool *dest, zend_bool *is_null, int check_null) { if (check_null) { *is_null = 0; @@ -1129,8 +1122,6 @@ static zend_always_inline int zend_parse_arg_bool(zval *arg, zend_bool *dest, ze *dest = 1; } else if (EXPECTED(Z_TYPE_P(arg) == IS_FALSE)) { *dest = 0; - } else if (ref_type && ((uintptr_t) ref_type) >> 1 != _IS_BOOL) { - return 0; } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { *is_null = 1; *dest = 0; @@ -1140,15 +1131,13 @@ static zend_always_inline int zend_parse_arg_bool(zval *arg, zend_bool *dest, ze return 1; } -static zend_always_inline int zend_parse_arg_long(zval *arg, zend_long *dest, zend_bool *is_null, int check_null, int cap, void *ref_type) +static zend_always_inline int zend_parse_arg_long(zval *arg, zend_long *dest, zend_bool *is_null, int check_null, int cap) { if (check_null) { *is_null = 0; } if (EXPECTED(Z_TYPE_P(arg) == IS_LONG)) { *dest = Z_LVAL_P(arg); - } else if (ref_type && ((uintptr_t) ref_type) >> 1 != IS_LONG) { - return 0; } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { *is_null = 1; *dest = 0; @@ -1160,15 +1149,13 @@ static zend_always_inline int zend_parse_arg_long(zval *arg, zend_long *dest, ze return 1; } -static zend_always_inline int zend_parse_arg_double(zval *arg, double *dest, zend_bool *is_null, int check_null, void *ref_type) +static zend_always_inline int zend_parse_arg_double(zval *arg, double *dest, zend_bool *is_null, int check_null) { if (check_null) { *is_null = 0; } if (EXPECTED(Z_TYPE_P(arg) == IS_DOUBLE)) { *dest = Z_DVAL_P(arg); - } else if (ref_type && ((uintptr_t) ref_type) >> 1 != IS_DOUBLE) { - return 0; } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { *is_null = 1; *dest = 0.0; @@ -1178,12 +1165,10 @@ static zend_always_inline int zend_parse_arg_double(zval *arg, double *dest, zen return 1; } -static zend_always_inline int zend_parse_arg_str(zval *arg, zend_string **dest, int check_null, void *ref_type) +static zend_always_inline int zend_parse_arg_str(zval *arg, zend_string **dest, int check_null) { if (EXPECTED(Z_TYPE_P(arg) == IS_STRING)) { *dest = Z_STR_P(arg); - } else if (ref_type && ((uintptr_t) ref_type) >> 1 != IS_STRING) { - return 0; } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { *dest = NULL; } else { @@ -1192,11 +1177,11 @@ static zend_always_inline int zend_parse_arg_str(zval *arg, zend_string **dest, return 1; } -static zend_always_inline int zend_parse_arg_string(zval *arg, char **dest, size_t *dest_len, int check_null, void *ref_type) +static zend_always_inline int zend_parse_arg_string(zval *arg, char **dest, size_t *dest_len, int check_null) { zend_string *str; - if (!zend_parse_arg_str(arg, &str, check_null, ref_type)) { + if (!zend_parse_arg_str(arg, &str, check_null)) { return 0; } if (check_null && UNEXPECTED(!str)) { @@ -1209,20 +1194,20 @@ static zend_always_inline int zend_parse_arg_string(zval *arg, char **dest, size return 1; } -static zend_always_inline int zend_parse_arg_path_str(zval *arg, zend_string **dest, int check_null, void *ref_type) +static zend_always_inline int zend_parse_arg_path_str(zval *arg, zend_string **dest, int check_null) { - if (!zend_parse_arg_str(arg, dest, check_null, ref_type) || + if (!zend_parse_arg_str(arg, dest, check_null) || (*dest && UNEXPECTED(CHECK_NULL_PATH(ZSTR_VAL(*dest), ZSTR_LEN(*dest))))) { return 0; } return 1; } -static zend_always_inline int zend_parse_arg_path(zval *arg, char **dest, size_t *dest_len, int check_null, void *ref_type) +static zend_always_inline int zend_parse_arg_path(zval *arg, char **dest, size_t *dest_len, int check_null) { zend_string *str; - if (!zend_parse_arg_path_str(arg, &str, check_null, ref_type)) { + if (!zend_parse_arg_path_str(arg, &str, check_null)) { return 0; } if (check_null && UNEXPECTED(!str)) { diff --git a/ext/curl/multi.c b/ext/curl/multi.c index c802edf46ddb..4ea28f6009a3 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -248,7 +248,7 @@ PHP_FUNCTION(curl_multi_exec) int still_running; CURLMcode error = CURLM_OK; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/", &z_mh, &z_still_running) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rZl", &z_mh, &z_still_running) == FAILURE) { return; } @@ -272,7 +272,6 @@ PHP_FUNCTION(curl_multi_exec) } } - convert_to_long(z_still_running); still_running = Z_LVAL_P(z_still_running); error = curl_multi_perform(mh->multi, &still_running); ZVAL_LONG(z_still_running, still_running); diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index 8c6105ac6f03..59966245ecaf 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -709,11 +709,11 @@ PHP_FUNCTION(pcntl_wait) struct rusage rusage; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "z/|lz/", &z_status, &options, &z_rusage) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Z!l|lt", &z_status, &options, &z_rusage) == FAILURE) { return; } - status = zval_get_long(z_status); + status = Z_ISNULL_P(z_status) ? 0 : Z_LVAL_P(z_status); #ifdef HAVE_WAIT3 if (z_rusage) { if (Z_TYPE_P(z_rusage) != IS_ARRAY) { @@ -743,7 +743,6 @@ PHP_FUNCTION(pcntl_wait) } #endif - zval_dtor(z_status); ZVAL_LONG(z_status, status); RETURN_LONG((zend_long) child_id); From 433e637c751549e25b9bb7880d9828badbb3cee2 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 13 Nov 2016 22:32:58 +0100 Subject: [PATCH 202/369] Remove all the nice code making it actually worse again ... --- Zend/zend_API.c | 129 ++-------------------------------------------- ext/curl/multi.c | 6 +-- ext/pcntl/pcntl.c | 6 +-- 3 files changed, 9 insertions(+), 132 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 0df34928ef36..91da10538fb5 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -500,13 +500,9 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons int check_null = 0; int separate = 0; zval *real_arg = arg; - void *ref_type = NULL; /* scan through modifiers */ - if (UNEXPECTED(Z_ISREF_P(arg))) { - ref_type = Z_REF_P(arg)->type; - arg = Z_REFVAL_P(arg); - } + ZVAL_DEREF(arg); while (1) { if (*spec_walk == '/') { SEPARATE_ZVAL_NOREF(arg); @@ -641,7 +637,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons { zval **p = va_arg(*va, zval **); - if (ref_type && !zend_verify_ref_type_assignable(ref_type, IS_ARRAY)) { + if (Z_ISREF_P(real_arg) && Z_REFTYPE_P(real_arg) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(real_arg), IS_ARRAY)) { return "array"; } @@ -747,124 +743,6 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons zend_parse_arg_zval_deref(real_arg, p, check_null); } break; - - case 'Z': - { - if (Z_TYPE_P(arg) == IS_NULL) { - if (!check_null) { - return "a non-null value"; - } - - if (ref_type) { - zend_uchar type; - char *expected; - switch (*spec_walk) { - case 'l': - case 'L': - type = IS_LONG; - expected = "integer"; - break; - case 'd': - type = IS_DOUBLE; - expected = "double"; - break; - case 's': - case 'S': - type = IS_STRING; - expected = "string"; - break; - case 'p': - case 'P': - type = IS_STRING; - expected = "a valid path"; - break; - case 'b': - type = _IS_BOOL; - expected = "boolean"; - break; - - default: - return "unknown"; - } - if (!zend_verify_ref_type_assignable(ref_type, type)) { - return expected; - } - } - } else { - switch (*spec_walk) { - case 'l': - if (Z_TYPE_P(arg) != IS_LONG) { - zend_long l; - if (ref_type || !zend_parse_arg_long_slow(arg, &l)) { - return "integer"; - } - ZVAL_LONG(arg, l); - } - break; - - case 'L': - if (Z_TYPE_P(arg) != IS_LONG) { - zend_long l; - if (ref_type || !zend_parse_arg_long_cap_slow(arg, &l)) { - return "integer"; - } - ZVAL_LONG(arg, l); - } - break; - - case 'd': - if (Z_TYPE_P(arg) != IS_DOUBLE) { - double d; - if (ref_type || !zend_parse_arg_double_slow(arg, &d)) { - return "double"; - } - ZVAL_DOUBLE(arg, d); - } - break; - - case 's': - case 'S': - if (Z_TYPE_P(arg) != IS_STRING) { - zend_string *s; - if (ref_type || !zend_parse_arg_str_slow(arg, &s)) { - return "string"; - } - ZVAL_STR(arg, s); - } - break; - - case 'p': - case 'P': - if (Z_TYPE_P(arg) != IS_STRING) { - zend_string *s; - if (ref_type || !zend_parse_arg_path_str(arg, &s, 0)) { - return "a valid path"; - } - ZVAL_STR(arg, s); - } else if (UNEXPECTED(CHECK_NULL_PATH(Z_STRVAL_P(arg), Z_STRLEN_P(arg)))) { - return "a valid path"; - } - break; - - case 'b': - if (Z_TYPE_P(arg) != IS_TRUE && Z_TYPE_P(arg) != IS_FALSE) { - zend_bool b; - if (ref_type || !zend_parse_arg_bool_slow(arg, &b)) { - return "boolean"; - } - ZVAL_BOOL(arg, b); - } - break; - - default: - return "unknown"; - } - } - - *((zval **) va_arg(*va, zval **)) = arg; - ++spec_walk; - } - break; } *spec = spec_walk; @@ -948,12 +826,12 @@ static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va, case 's': case 'b': case 'r': case 'a': case 'o': case 'O': - case 'z': case 'C': case 'h': case 'f': case 'A': case 'H': case 'p': case 'S': case 'P': case 'L': case 't': + case 'z': max_num_args++; break; @@ -963,7 +841,6 @@ static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va, case '/': case '!': - case 'Z': /* Pass */ break; diff --git a/ext/curl/multi.c b/ext/curl/multi.c index 4ea28f6009a3..d5465e2ab2fd 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -248,7 +248,7 @@ PHP_FUNCTION(curl_multi_exec) int still_running; CURLMcode error = CURLM_OK; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rZl", &z_mh, &z_still_running) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz", &z_mh, &z_still_running) == FAILURE) { return; } @@ -272,9 +272,9 @@ PHP_FUNCTION(curl_multi_exec) } } - still_running = Z_LVAL_P(z_still_running); + still_running = zval_get_long(z_still_running); error = curl_multi_perform(mh->multi, &still_running); - ZVAL_LONG(z_still_running, still_running); + ZEND_TRY_ASSIGN_LONG(z_still_running, still_running); SAVE_CURLM_ERROR(mh, error); RETURN_LONG((zend_long) error); diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index 59966245ecaf..2acf42272f28 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -709,11 +709,11 @@ PHP_FUNCTION(pcntl_wait) struct rusage rusage; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "Z!l|lt", &z_status, &options, &z_rusage) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|lt", &z_status, &options, &z_rusage) == FAILURE) { return; } - status = Z_ISNULL_P(z_status) ? 0 : Z_LVAL_P(z_status); + status = zval_get_long(z_status); #ifdef HAVE_WAIT3 if (z_rusage) { if (Z_TYPE_P(z_rusage) != IS_ARRAY) { @@ -743,7 +743,7 @@ PHP_FUNCTION(pcntl_wait) } #endif - ZVAL_LONG(z_status, status); + ZEND_TRY_ASSIGN_LONG(z_status, status); RETURN_LONG((zend_long) child_id); } From f4ea705d251e2321d2b52b4e24e2f3efba48d096 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 13 Nov 2016 22:52:40 +0100 Subject: [PATCH 203/369] Use reftype, not its location... --- Zend/zend_types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 723958e7dcf0..7f483d495724 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -573,7 +573,7 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { #define Z_REFVAL(zval) &Z_REF(zval)->val #define Z_REFVAL_P(zval_p) Z_REFVAL(*(zval_p)) -#define Z_REFTYPE(zval) &Z_REF(zval)->type +#define Z_REFTYPE(zval) Z_REF(zval)->type #define Z_REFTYPE_P(zval_p) Z_REFTYPE(*(zval_p)) #define Z_AST(zval) (zval).value.ast From ad85b553c7c7d4ee7e42473a095ba0c242db0c9e Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 13 Nov 2016 21:54:06 +0000 Subject: [PATCH 204/369] few changes for bob to check --- ext/curl/multi.c | 6 +++--- ext/enchant/enchant.c | 2 +- ext/exif/exif.c | 11 ++++------- ext/ftp/php_ftp.c | 6 +++--- ext/ldap/ldap.c | 17 ++++++----------- 5 files changed, 17 insertions(+), 25 deletions(-) diff --git a/ext/curl/multi.c b/ext/curl/multi.c index d5465e2ab2fd..2d6d4ee56191 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -318,7 +318,7 @@ PHP_FUNCTION(curl_multi_info_read) int queued_msgs; zval *zmsgs_in_queue = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|z/", &z_mh, &zmsgs_in_queue) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|z", &z_mh, &zmsgs_in_queue) == FAILURE) { return; } @@ -330,9 +330,9 @@ PHP_FUNCTION(curl_multi_info_read) if (tmp_msg == NULL) { RETURN_FALSE; } + if (zmsgs_in_queue) { - zval_dtor(zmsgs_in_queue); - ZVAL_LONG(zmsgs_in_queue, queued_msgs); + ZEND_TRY_ASSIGN_LONG(zmsgs_in_queue, queued_msgs); } array_init(return_value); diff --git a/ext/enchant/enchant.c b/ext/enchant/enchant.c index ef2634918f40..641231a57ea3 100644 --- a/ext/enchant/enchant.c +++ b/ext/enchant/enchant.c @@ -710,7 +710,7 @@ PHP_FUNCTION(enchant_dict_quick_check) size_t wordlen; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|z/", &dict, &word, &wordlen, &sugg) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|t", &dict, &word, &wordlen, &sugg) == FAILURE) { RETURN_FALSE; } diff --git a/ext/exif/exif.c b/ext/exif/exif.c index c882a12c7c83..bbfa5a0f614b 100644 --- a/ext/exif/exif.c +++ b/ext/exif/exif.c @@ -4532,7 +4532,7 @@ PHP_FUNCTION(exif_thumbnail) WRONG_PARAM_COUNT; } - if (zend_parse_parameters(arg_c, "p|z/z/z/", &p_name, &p_name_len, &p_width, &p_height, &p_imagetype) == FAILURE) { + if (zend_parse_parameters(arg_c, "p|zzz", &p_name, &p_name_len, &p_width, &p_height, &p_imagetype) == FAILURE) { return; } @@ -4559,14 +4559,11 @@ PHP_FUNCTION(exif_thumbnail) if (!ImageInfo.Thumbnail.width || !ImageInfo.Thumbnail.height) { exif_scan_thumbnail(&ImageInfo); } - zval_dtor(p_width); - zval_dtor(p_height); - ZVAL_LONG(p_width, ImageInfo.Thumbnail.width); - ZVAL_LONG(p_height, ImageInfo.Thumbnail.height); + ZEND_TRY_ASSIGN_LONG(p_width, ImageInfo.Thumbnail.width); + ZEND_TRY_ASSIGN_LONG(p_height, ImageInfo.Thumbnail.height); } if (arg_c >= 4) { - zval_dtor(p_imagetype); - ZVAL_LONG(p_imagetype, ImageInfo.Thumbnail.filetype); + ZEND_TRY_ASSIGN_LONG(p_imagetype, ImageInfo.Thumbnail.filetype); } #ifdef EXIF_DEBUG diff --git a/ext/ftp/php_ftp.c b/ext/ftp/php_ftp.c index 8afd3e2b6d10..fcf42a302f35 100644 --- a/ext/ftp/php_ftp.c +++ b/ext/ftp/php_ftp.c @@ -669,7 +669,7 @@ PHP_FUNCTION(ftp_alloc) zend_long size, ret; zend_string *response = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|z/", &z_ftp, &size, &zresponse) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|z", &z_ftp, &size, &zresponse) == FAILURE) { RETURN_FALSE; } @@ -678,9 +678,9 @@ PHP_FUNCTION(ftp_alloc) } ret = ftp_alloc(ftp, size, zresponse ? &response : NULL); + if (response) { - zval_dtor(zresponse); - ZVAL_STR(zresponse, response); + ZEND_TRY_ASSIGN_STR(zresponse, response); } if (!ret) { diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index 0f82354ac9a0..f9178f5e2761 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -2127,7 +2127,7 @@ PHP_FUNCTION(ldap_get_option) ldap_linkdata *ld; zend_long option; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz/", &link, &option, &retval) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz", &link, &option, &retval) != SUCCESS) { return; } @@ -2169,8 +2169,7 @@ PHP_FUNCTION(ldap_get_option) if (ldap_get_option(ld->link, option, &val)) { RETURN_FALSE; } - zval_ptr_dtor(retval); - ZVAL_LONG(retval, val); + ZEND_TRY_ASSIGN_LONG(retval, val); } break; #ifdef LDAP_OPT_NETWORK_TIMEOUT case LDAP_OPT_NETWORK_TIMEOUT: @@ -2186,8 +2185,7 @@ PHP_FUNCTION(ldap_get_option) if (!timeout) { RETURN_FALSE; } - zval_ptr_dtor(retval); - ZVAL_LONG(retval, timeout->tv_sec); + ZEND_TRY_ASSIGN_LONG(retval, timeout->tv_sec); ldap_memfree(timeout); } break; #elif defined(LDAP_X_OPT_CONNECT_TIMEOUT) @@ -2198,8 +2196,7 @@ PHP_FUNCTION(ldap_get_option) if (ldap_get_option(ld->link, LDAP_X_OPT_CONNECT_TIMEOUT, &timeout)) { RETURN_FALSE; } - zval_ptr_dtor(retval); - ZVAL_LONG(retval, (timeout / 1000)); + ZEND_TRY_ASSIGN_LONG(retval, (timeout / 1000)); } break; #endif #ifdef LDAP_OPT_TIMEOUT @@ -2216,8 +2213,7 @@ PHP_FUNCTION(ldap_get_option) if (!timeout) { RETURN_FALSE; } - zval_dtor(retval); - ZVAL_LONG(retval, timeout->tv_sec); + ZEND_TRY_ASSIGN_LONG(retval, timeout->tv_sec); ldap_memfree(timeout); } break; #endif @@ -2264,8 +2260,7 @@ PHP_FUNCTION(ldap_get_option) } RETURN_FALSE; } - zval_ptr_dtor(retval); - ZVAL_STRING(retval, val); + ZEND_TRY_ASSIGN_STRING(retval, val); ldap_memfree(val); } break; /* options not implemented From 276986623feaea83a5500c96d3a484e17b3ff7c0 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 13 Nov 2016 22:14:23 +0000 Subject: [PATCH 205/369] more zpp changes --- ext/mbstring/mbstring.c | 2 +- ext/mbstring/php_mbregex.c | 2 +- ext/openssl/openssl.c | 17 +++++++---------- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index d6d7cfc43285..846e2b0dc998 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2092,7 +2092,7 @@ PHP_FUNCTION(mb_parse_str) const mbfl_encoding *detected; track_vars_array = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z/", &encstr, &encstr_len, &track_vars_array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|t", &encstr, &encstr_len, &track_vars_array) == FAILURE) { return; } diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c index a9e464fa6415..0719cd28303a 100644 --- a/ext/mbstring/php_mbregex.c +++ b/ext/mbstring/php_mbregex.c @@ -699,7 +699,7 @@ static void _php_mb_regex_ereg_exec(INTERNAL_FUNCTION_PARAMETERS, int icase) OnigOptionType options; char *str; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs|z/", &arg_pattern, &string, &string_len, &array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs|t", &arg_pattern, &string, &string_len, &array) == FAILURE) { RETURN_FALSE; } diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 3593cdc3e085..625a304e7903 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -2046,7 +2046,7 @@ PHP_FUNCTION(openssl_x509_export) BIO * bio_out; zend_resource *certresource; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz/|b", &zcert, &zout, ¬ext) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz|b", &zcert, &zout, ¬ext) == FAILURE) { return; } RETVAL_FALSE; @@ -2068,9 +2068,8 @@ PHP_FUNCTION(openssl_x509_export) if (PEM_write_bio_X509(bio_out, cert)) { BUF_MEM *bio_buf; - zval_dtor(zout); BIO_get_mem_ptr(bio_out, &bio_buf); - ZVAL_STRINGL(zout, bio_buf->data, bio_buf->length); + ZEND_TRY_ASSIGN_STRINGL(zout, bio_buf->data, bio_buf->length); RETVAL_TRUE; } else { @@ -2802,7 +2801,7 @@ PHP_FUNCTION(openssl_pkcs12_export) zval * item; STACK_OF(X509) *ca = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz/zs|a", &zcert, &zout, &zpkey, &pass, &pass_len, &args) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zzzs|a", &zcert, &zout, &zpkey, &pass, &pass_len, &args) == FAILURE) return; RETVAL_FALSE; @@ -2837,9 +2836,8 @@ PHP_FUNCTION(openssl_pkcs12_export) if (i2d_PKCS12_bio(bio_out, p12)) { BUF_MEM *bio_buf; - zval_dtor(zout); BIO_get_mem_ptr(bio_out, &bio_buf); - ZVAL_STRINGL(zout, bio_buf->data, bio_buf->length); + ZEND_TRY_ASSIGN_STRINGL(zout, bio_buf->data, bio_buf->length); RETVAL_TRUE; } else { @@ -2878,7 +2876,7 @@ PHP_FUNCTION(openssl_pkcs12_read) BIO * bio_in = NULL; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/s", &zp12, &zp12_len, &zout, &pass, &pass_len) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sts", &zp12, &zp12_len, &zout, &pass, &pass_len) == FAILURE) return; RETVAL_FALSE; @@ -3246,7 +3244,7 @@ PHP_FUNCTION(openssl_csr_export) BIO * bio_out; zend_resource *csr_resource; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/|b", &zcsr, &zout, ¬ext) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz|b", &zcsr, &zout, ¬ext) == FAILURE) { return; } @@ -3269,8 +3267,7 @@ PHP_FUNCTION(openssl_csr_export) BUF_MEM *bio_buf; BIO_get_mem_ptr(bio_out, &bio_buf); - zval_dtor(zout); - ZVAL_STRINGL(zout, bio_buf->data, bio_buf->length); + ZEND_TRY_ASSIGN_STRINGL(zout, bio_buf->data, bio_buf->length); RETVAL_TRUE; } else { From 8d3a9f6e7b99e27ae4b442c976fc427bbf3ef76c Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 13 Nov 2016 22:29:27 +0000 Subject: [PATCH 206/369] finish pcntl, probably --- ext/pcntl/pcntl.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index 2acf42272f28..aa77ba4c8388 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -656,7 +656,7 @@ PHP_FUNCTION(pcntl_waitpid) struct rusage rusage; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz/|lz/", &pid, &z_status, &options, &z_rusage) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz|lt/", &pid, &z_status, &options, &z_rusage) == FAILURE) { return; } @@ -667,8 +667,6 @@ PHP_FUNCTION(pcntl_waitpid) if (Z_TYPE_P(z_rusage) != IS_ARRAY) { zval_dtor(z_rusage); array_init(z_rusage); - } else { - zend_hash_clean(Z_ARRVAL_P(z_rusage)); } memset(&rusage, 0, sizeof(struct rusage)); @@ -690,8 +688,7 @@ PHP_FUNCTION(pcntl_waitpid) } #endif - zval_dtor(z_status); - ZVAL_LONG(z_status, status); + ZEND_TRY_ASSIGN_LONG(z_status, status); RETURN_LONG((zend_long) child_id); } @@ -1084,7 +1081,7 @@ PHP_FUNCTION(pcntl_sigprocmask) zval *user_set, *user_oldset = NULL, *user_signo; sigset_t set, oldset; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "la|z/", &how, &user_set, &user_oldset) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "la|t/", &how, &user_set, &user_oldset) == FAILURE) { return; } @@ -1113,9 +1110,8 @@ PHP_FUNCTION(pcntl_sigprocmask) if (Z_TYPE_P(user_oldset) != IS_ARRAY) { zval_dtor(user_oldset); array_init(user_oldset); - } else { - zend_hash_clean(Z_ARRVAL_P(user_oldset)); } + for (signo = 1; signo < MAX(NSIG-1, SIGRTMAX); ++signo) { if (sigismember(&oldset, signo) != 1) { continue; @@ -1141,11 +1137,11 @@ static void pcntl_sigwaitinfo(INTERNAL_FUNCTION_PARAMETERS, int timedwait) /* {{ struct timespec timeout; if (timedwait) { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|z/ll", &user_set, &user_siginfo, &tv_sec, &tv_nsec) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|t/ll", &user_set, &user_siginfo, &tv_sec, &tv_nsec) == FAILURE) { return; } } else { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|z/", &user_set, &user_siginfo) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|t/", &user_set, &user_siginfo) == FAILURE) { return; } } @@ -1212,9 +1208,8 @@ static void pcntl_siginfo_to_zval(int signo, siginfo_t *siginfo, zval *user_sigi if (Z_TYPE_P(user_siginfo) != IS_ARRAY) { zval_dtor(user_siginfo); array_init(user_siginfo); - } else { - zend_hash_clean(Z_ARRVAL_P(user_siginfo)); } + add_assoc_long_ex(user_siginfo, "signo", sizeof("signo")-1, siginfo->si_signo); add_assoc_long_ex(user_siginfo, "errno", sizeof("errno")-1, siginfo->si_errno); add_assoc_long_ex(user_siginfo, "code", sizeof("code")-1, siginfo->si_code); From d7c7b9c01244f370d4a93ccc63ffe76f793c4d46 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 13 Nov 2016 22:33:58 +0000 Subject: [PATCH 207/369] some of sockets --- ext/sockets/sockets.c | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 432551a920c4..c8037dbdcc4a 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -1269,7 +1269,7 @@ PHP_FUNCTION(socket_getsockname) char *addr_string; socklen_t salen = sizeof(php_sockaddr_storage); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/|z/", &arg1, &addr, &port) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz|z", &arg1, &addr, &port) == FAILURE) { return; } @@ -1293,12 +1293,10 @@ PHP_FUNCTION(socket_getsockname) case AF_INET6: sin6 = (struct sockaddr_in6 *) sa; inet_ntop(AF_INET6, &sin6->sin6_addr, addr6, INET6_ADDRSTRLEN); - zval_dtor(addr); - ZVAL_STRING(addr, addr6); + ZEND_TRY_ASSIGN_STRING(addr, addr6); if (port != NULL) { - zval_dtor(port); - ZVAL_LONG(port, htons(sin6->sin6_port)); + ZEND_TRY_ASSIGN_LONG(port, htons(sin6->sin6_port)); } RETURN_TRUE; break; @@ -1310,12 +1308,10 @@ PHP_FUNCTION(socket_getsockname) addr_string = inet_ntoa(sin->sin_addr); inet_ntoa_lock = 0; - zval_dtor(addr); - ZVAL_STRING(addr, addr_string); + ZEND_TRY_ASSIGN_STRING(addr, addr_string); if (port != NULL) { - zval_dtor(port); - ZVAL_LONG(port, htons(sin->sin_port)); + ZEND_TRY_ASSIGN_LONG(port, htons(sin->sin_port)); } RETURN_TRUE; break; @@ -1323,8 +1319,7 @@ PHP_FUNCTION(socket_getsockname) case AF_UNIX: s_un = (struct sockaddr_un *) sa; - zval_dtor(addr); - ZVAL_STRING(addr, s_un->sun_path); + ZEND_TRY_ASSIGN_STRING(addr, s_un->sun_path); RETURN_TRUE; break; @@ -1352,7 +1347,7 @@ PHP_FUNCTION(socket_getpeername) char *addr_string; socklen_t salen = sizeof(php_sockaddr_storage); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/|z/", &arg1, &arg2, &arg3) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz|z", &arg1, &arg2, &arg3) == FAILURE) { return; } @@ -1372,12 +1367,11 @@ PHP_FUNCTION(socket_getpeername) case AF_INET6: sin6 = (struct sockaddr_in6 *) sa; inet_ntop(AF_INET6, &sin6->sin6_addr, addr6, INET6_ADDRSTRLEN); - zval_dtor(arg2); - ZVAL_STRING(arg2, addr6); + + ZEND_TRY_ASSIGN_STRING(arg2, addr6); if (arg3 != NULL) { - zval_dtor(arg3); - ZVAL_LONG(arg3, htons(sin6->sin6_port)); + ZEND_TRY_ASSIGN_LONG(arg3, htons(sin6->sin6_port)); } RETURN_TRUE; @@ -1390,12 +1384,10 @@ PHP_FUNCTION(socket_getpeername) addr_string = inet_ntoa(sin->sin_addr); inet_ntoa_lock = 0; - zval_dtor(arg2); - ZVAL_STRING(arg2, addr_string); + ZEND_TRY_ASSIGN_STRING(arg2, addr_string); if (arg3 != NULL) { - zval_dtor(arg3); - ZVAL_LONG(arg3, htons(sin->sin_port)); + ZEND_TRY_ASSIGN_LONG(arg3, htons(sin->sin_port)); } RETURN_TRUE; @@ -1404,8 +1396,7 @@ PHP_FUNCTION(socket_getpeername) case AF_UNIX: s_un = (struct sockaddr_un *) sa; - zval_dtor(arg2); - ZVAL_STRING(arg2, s_un->sun_path); + ZEND_TRY_ASSIGN_STRING(arg2, s_un->sun_path); RETURN_TRUE; break; From cd32f63a44f186935427bac2322cfce22223c242 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 13 Nov 2016 22:52:04 +0000 Subject: [PATCH 208/369] more zpppppp stuff --- ext/standard/array.c | 7 +------ ext/standard/type.c | 7 +++---- ext/xml/xml.c | 2 +- ext/zip/php_zip.c | 16 ++++++---------- 4 files changed, 11 insertions(+), 21 deletions(-) diff --git a/ext/standard/array.c b/ext/standard/array.c index f3a7f4de84cd..4e006db8b985 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2801,7 +2801,7 @@ PHP_FUNCTION(array_splice) length = 0; int num_in; /* Number of elements in the input array */ - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a/l|lz/", &array, &offset, &length, &repl_array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a/l|lt", &array, &offset, &length, &repl_array) == FAILURE) { return; } @@ -2811,11 +2811,6 @@ PHP_FUNCTION(array_splice) length = num_in; } - if (ZEND_NUM_ARGS() == 4) { - /* Make sure the last argument, if passed, is an array */ - convert_to_array_ex(repl_array); - } - /* Don't create the array of removed elements if it's not going * to be used; e.g. only removing and/or replacing elements */ if (USED_RET()) { diff --git a/ext/standard/type.c b/ext/standard/type.c index 88a150157025..950fc79c335c 100644 --- a/ext/standard/type.c +++ b/ext/standard/type.c @@ -358,7 +358,7 @@ PHP_FUNCTION(is_callable) zend_bool syntax_only = 0; int check_flags = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|bz/", &var, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|bz", &var, &syntax_only, &callable_name) == FAILURE) { return; } @@ -368,13 +368,12 @@ PHP_FUNCTION(is_callable) } if (ZEND_NUM_ARGS() > 2) { retval = zend_is_callable_ex(var, NULL, check_flags, &name, NULL, &error); - zval_dtor(callable_name); //??? is it necessary to be consistent with old PHP ("\0" support) if (UNEXPECTED(ZSTR_LEN(name) != strlen(ZSTR_VAL(name)))) { - ZVAL_STRINGL(callable_name, ZSTR_VAL(name), strlen(ZSTR_VAL(name))); + ZEND_STR_ASSIGN_STRINGL(callable_name, ZSTR_VAL(name), strlen(ZSTR_VAL(name))); zend_string_release(name); } else { - ZVAL_STR(callable_name, name); + ZEND_STR_ASSIGN_STR(callable_name, name); } } else { retval = zend_is_callable_ex(var, NULL, check_flags, NULL, NULL, &error); diff --git a/ext/xml/xml.c b/ext/xml/xml.c index f8d72523a00e..ed8d29723920 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -1412,7 +1412,7 @@ PHP_FUNCTION(xml_parse_into_struct) size_t data_len; int ret; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsz/|z/", &pind, &data, &data_len, &xdata, &info) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rst/|t/", &pind, &data, &data_len, &xdata, &info) == FAILURE) { return; } diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 4685fb248689..814d510a5bb1 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -2161,7 +2161,7 @@ static ZIPARCHIVE_METHOD(getExternalAttributesName) ZIP_FROM_OBJECT(intern, self); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z/|l", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|l", &name, &name_len, &z_opsys, &z_attr, &flags) == FAILURE) { return; } @@ -2178,10 +2178,8 @@ static ZIPARCHIVE_METHOD(getExternalAttributesName) (zip_flags_t)flags, &opsys, &attr) < 0) { RETURN_FALSE; } - zval_ptr_dtor(z_opsys); - ZVAL_LONG(z_opsys, opsys); - zval_ptr_dtor(z_attr); - ZVAL_LONG(z_attr, attr); + ZEND_TRY_ASSIGN_LONG(z_opsys, opsys); + ZEND_TRY_ASSIGN_LONG(z_attr, attr); RETURN_TRUE; } /* }}} */ @@ -2203,7 +2201,7 @@ static ZIPARCHIVE_METHOD(getExternalAttributesIndex) ZIP_FROM_OBJECT(intern, self); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz/z/|l", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "lzz|l", &index, &z_opsys, &z_attr, &flags) == FAILURE) { return; } @@ -2213,10 +2211,8 @@ static ZIPARCHIVE_METHOD(getExternalAttributesIndex) (zip_flags_t)flags, &opsys, &attr) < 0) { RETURN_FALSE; } - zval_dtor(z_opsys); - ZVAL_LONG(z_opsys, opsys); - zval_dtor(z_attr); - ZVAL_LONG(z_attr, attr); + ZEND_TRY_ASSIGN_LONG(z_opsys, opsys); + ZEND_TRY_ASSIGN_LONG(z_attr, attr); RETURN_TRUE; } /* }}} */ From a0aaeed7a2884ca86c6bd237b204aacc62345036 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 13 Nov 2016 22:53:01 +0000 Subject: [PATCH 209/369] use macros that actually exist, rather than nonsense --- ext/standard/type.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/standard/type.c b/ext/standard/type.c index 950fc79c335c..0e0c6f506d70 100644 --- a/ext/standard/type.c +++ b/ext/standard/type.c @@ -370,10 +370,10 @@ PHP_FUNCTION(is_callable) retval = zend_is_callable_ex(var, NULL, check_flags, &name, NULL, &error); //??? is it necessary to be consistent with old PHP ("\0" support) if (UNEXPECTED(ZSTR_LEN(name) != strlen(ZSTR_VAL(name)))) { - ZEND_STR_ASSIGN_STRINGL(callable_name, ZSTR_VAL(name), strlen(ZSTR_VAL(name))); + ZEND_TRY_ASSIGN_STRINGL(callable_name, ZSTR_VAL(name), strlen(ZSTR_VAL(name))); zend_string_release(name); } else { - ZEND_STR_ASSIGN_STR(callable_name, name); + ZEND_TRY_ASSIGN_STR(callable_name, name); } } else { retval = zend_is_callable_ex(var, NULL, check_flags, NULL, NULL, &error); From 93707d7856bffd5201ad2613b259652b22c28f16 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 14 Nov 2016 03:38:49 +0100 Subject: [PATCH 210/369] Fix a ton of bugs and tests --- .../typed_properties_003.phpt | 4 +- .../typed_properties_010.phpt | 9 +- .../typed_properties_011.phpt | 13 +- .../typed_properties_032.phpt | 12 +- .../typed_properties_033.phpt | 37 +- .../typed_properties_034.phpt | 61 +- .../typed_properties_044.phpt | 48 +- .../typed_properties_055.phpt | 10 +- Zend/zend_API.h | 1 + Zend/zend_compile.c | 1 + Zend/zend_execute.h | 10 +- Zend/zend_vm_def.h | 64 +- Zend/zend_vm_execute.h | 823 ++++++++++-------- 13 files changed, 610 insertions(+), 483 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_003.phpt b/Zend/tests/type_declarations/typed_properties_003.phpt index cf85fc409312..c96a464680fa 100644 --- a/Zend/tests/type_declarations/typed_properties_003.phpt +++ b/Zend/tests/type_declarations/typed_properties_003.phpt @@ -1,5 +1,5 @@ --TEST-- -Test typed properties error condition (fetch reference) +Test typed properties error condition (fetch uninitialized by reference) --FILE-- int; ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property class@anonymous::$int must not be referenced in %s:%d +Fatal error: Uncaught Error: Cannot access uninitialized non-nullable property by reference in %s:%d Stack trace: #0 {main} thrown in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_010.phpt b/Zend/tests/type_declarations/typed_properties_010.phpt index 3ef8eceb5f15..8b5cc049825d 100644 --- a/Zend/tests/type_declarations/typed_properties_010.phpt +++ b/Zend/tests/type_declarations/typed_properties_010.phpt @@ -1,5 +1,5 @@ --TEST-- -Test typed properties disallow fetch reference for func arg +Test typed properties allow fetch reference --FILE-- bar); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Foo::$bar must not be referenced in %s:11 -Stack trace: -#0 {main} - thrown in %s on line 11 - - +int(1) diff --git a/Zend/tests/type_declarations/typed_properties_011.phpt b/Zend/tests/type_declarations/typed_properties_011.phpt index 5f3dbdd52ae4..074327ff26a8 100644 --- a/Zend/tests/type_declarations/typed_properties_011.phpt +++ b/Zend/tests/type_declarations/typed_properties_011.phpt @@ -1,5 +1,5 @@ --TEST-- -Test typed properties disallow fetch reference for init array +Test typed properties allow fetch reference for init array --FILE-- bar]; +var_dump($array); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Foo::$bar must not be referenced in %s:8 -Stack trace: -#0 {main} - thrown in %s on line 8 - - +array(1) { + [0]=> + &int(1) +} diff --git a/Zend/tests/type_declarations/typed_properties_032.phpt b/Zend/tests/type_declarations/typed_properties_032.phpt index 84b2823fb1cb..017e18eceeff 100644 --- a/Zend/tests/type_declarations/typed_properties_032.phpt +++ b/Zend/tests/type_declarations/typed_properties_032.phpt @@ -1,21 +1,15 @@ --TEST-- -Test typed properties return by ref is disallowed +Test typed properties return by ref is allowed --FILE-- bar; } }; var_dump($foo->method()); --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property class@anonymous::$bar must not be referenced in %s:7 -Stack trace: -#0 %s(11): class@anonymous->method() -#1 {main} - thrown in %s on line 7 - +int(15) diff --git a/Zend/tests/type_declarations/typed_properties_033.phpt b/Zend/tests/type_declarations/typed_properties_033.phpt index 11eaa1ac8bd1..d1f7302933f2 100644 --- a/Zend/tests/type_declarations/typed_properties_033.phpt +++ b/Zend/tests/type_declarations/typed_properties_033.phpt @@ -3,17 +3,36 @@ Test typed properties yield reference guard --FILE-- bar]; + public function &fetch() { + yield $this->foo; + yield $this->bar; + yield $this->baz; + yield $this->qux; } }; -foreach ($foo->fetch() as $prop); +try { + foreach ($foo->fetch() as &$prop) { + $prop++; + } +} catch (Error $e) { echo $e->getMessage(), "\n"; } + +var_dump($foo); +?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property class@anonymous::$bar must not be referenced in %s:6 -Stack trace: -#0 %s(10): class@anonymous->fetch() -#1 {main} - thrown in %s on line 6 +Cannot assign float to reference of type integer +object(class@anonymous)#1 (4) { + ["foo"]=> + int(2) + ["bar"]=> + int(4) + ["baz"]=> + int(6) + ["qux"]=> + &int(9223372036854775807) +} diff --git a/Zend/tests/type_declarations/typed_properties_034.phpt b/Zend/tests/type_declarations/typed_properties_034.phpt index dc6d58170d00..99f9e3b59206 100644 --- a/Zend/tests/type_declarations/typed_properties_034.phpt +++ b/Zend/tests/type_declarations/typed_properties_034.phpt @@ -1,24 +1,51 @@ --TEST-- -Test typed properties add array element guard +Test typed properties passed to typed function --FILE-- bar] as $item) - { - yield $item; - } - } + public function &getIterator() { + foreach (['1', &$this->bar] as &$item) { + yield $item; + } + } }; -foreach($foo->getIterator() as $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); +?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property class@anonymous::$bar must not be referenced in %s:8 -Stack trace: -#0 %s(15): class@anonymous->getIterator() -#1 {main} - thrown in %s on line 8 +int(42) +Cannot assign null to reference of type integer +int(1) +int(10) +int(10) +Cannot assign null to reference of type integer +object(class@anonymous)#1 (2) { + ["bar"]=> + &int(10) + ["baz"]=> + &int(10) +} diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt index 3dc96e25166c..3e75a071f505 100644 --- a/Zend/tests/type_declarations/typed_properties_044.phpt +++ b/Zend/tests/type_declarations/typed_properties_044.phpt @@ -1,27 +1,55 @@ --TEST-- -Error message should be the same independently of called function +Test increment functions on typed property references --FILE-- bar; + +$bar *= 1; + +var_dump($bar--); +var_dump(--$bar); +var_dump(++$bar); +var_dump($bar++); + +$bar = PHP_INT_MAX; + +try { + var_dump($bar++); +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; } -function foo(&$x) { +try { + var_dump(++$bar); +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; } -$f = function (&$x) {}; +$bar = PHP_INT_MIN; -$foo = new Foo(); try { - foo($foo->bar); + var_dump($bar--); } catch (Throwable $e) { echo $e->getMessage() . "\n"; } + try { - $f($foo->bar); + var_dump(--$bar); } catch (Throwable $e) { echo $e->getMessage() . "\n"; } +?> --EXPECT-- -Typed property Foo::$bar must not be referenced -Typed property Foo::$bar must not be referenced +int(0) +int(-2) +int(-1) +int(-1) +Cannot assign float to reference of type ?integer +Cannot assign float to reference of type ?integer +Cannot assign float to reference of type ?integer +Cannot assign float to reference of type ?integer + diff --git a/Zend/tests/type_declarations/typed_properties_055.phpt b/Zend/tests/type_declarations/typed_properties_055.phpt index 16c958acf33d..24ad1f6f9145 100644 --- a/Zend/tests/type_declarations/typed_properties_055.phpt +++ b/Zend/tests/type_declarations/typed_properties_055.phpt @@ -11,7 +11,7 @@ class B { } $f = function (&$n) { var_dump($n); - $i = "ops"; + $n = "ops"; }; $o = new B; $o->a = new A; @@ -20,8 +20,10 @@ $f($o->a->bar); ?> --EXPECTF-- int(1) +int(2) -Fatal error: Uncaught TypeError: Typed property A::$bar must not be referenced in %styped_properties_055.php:16 +Fatal error: Uncaught TypeError: Cannot assign string to reference of type integer in %s:%d Stack trace: -#0 {main} - thrown in %styped_properties_055.php on line 16 +#0 %s(%d): {closure}(2) +#1 {main} + thrown in %s on line %d diff --git a/Zend/zend_API.h b/Zend/zend_API.h index f6802f5940b8..74d1da8c589d 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -693,6 +693,7 @@ static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { return FAILURE; } } else { + ZVAL_DEREF(zv); zval_ptr_dtor(zv); ZVAL_COPY(zv, arg); } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 0c2355dc9840..287f53631159 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3085,6 +3085,7 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ if (target_node.op_type == IS_VAR && opline->opcode == ZEND_FETCH_OBJ_W) { opline->opcode = ZEND_ASSIGN_OBJ_REF; zend_emit_op_data(&source_node); + zend_make_var_result(result, opline); } else { opline = zend_emit_op(result, ZEND_ASSIGN_REF, &target_node, &source_node); } diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 49cdaaee7247..50c01d5a255a 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -80,12 +80,10 @@ static zend_always_inline void *zend_get_prop_info_ref_type(zend_property_info * /* do not call when new_type == IS_REFERENCE or new_type == IS_OBJECT! */ static zend_always_inline zend_bool zend_verify_ref_type_assignable(void *type, zend_uchar new_type) { - if (0xFF >= (uintptr_t) type) { - zend_uchar cur_type = ((uintptr_t) type) >> 1; - return new_type == cur_type || (new_type == _IS_BOOL && (cur_type == IS_FALSE || cur_type == IS_TRUE)); - } else { - return (0x1 & (uintptr_t) type) && new_type == IS_NULL; - } + zend_uchar cur_type = ((uintptr_t) type) >> 1; + return new_type == cur_type + || ((0x1 & (uintptr_t) type) && new_type == IS_NULL) + || (new_type == _IS_BOOL && (cur_type == IS_FALSE || cur_type == IS_TRUE)); } ZEND_API zend_bool zend_verify_ref_type_assignable_zval(void *type, zval *zv, zend_bool strict); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index ce51d560794d..a77085b4303e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -957,7 +957,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_helper, VAR|CV, CONST|TMPVAR|CV, binary_op_ } else { void *type = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -1496,7 +1496,7 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -1513,6 +1513,8 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -1557,7 +1559,7 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -1574,6 +1576,8 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -1614,7 +1618,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -1659,7 +1663,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -2792,7 +2796,7 @@ ZEND_VM_HANDLER(100, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S property = GET_OP2_ZVAL_PTR(BP_VAR_R); - container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); + container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { zend_throw_error(NULL, "Using $this when not in object context"); FREE_OP2(); @@ -2835,33 +2839,36 @@ ZEND_VM_HANDLER(100, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); FREE_OP1_VAR_PTR(); FREE_OP2(); @@ -2881,7 +2888,7 @@ ZEND_VM_HANDLER(100, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S FREE_OP1_VAR_PTR(); FREE_OP2(); FREE_OP_DATA_VAR_PTR(); - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) @@ -8462,6 +8469,7 @@ ZEND_VM_HANDLER(183, ZEND_BIND_STATIC, CV, CONST, REF) GC_REFCOUNT(ref) = 2; GC_TYPE_INFO(ref) = IS_REFERENCE; ZVAL_COPY_VALUE(&ref->val, value); + ref->type = NULL; Z_REF_P(value) = ref; Z_TYPE_INFO_P(value) = IS_REFERENCE_EX; ZVAL_REF(variable_ptr, ref); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a397bb802e4a..d5cf21a464d7 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -20183,32 +20183,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -20228,7 +20231,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ 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_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -20304,32 +20307,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -20349,7 +20355,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -25465,32 +25471,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25510,7 +25519,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ 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_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -25586,32 +25595,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25631,7 +25643,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -28762,32 +28774,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); @@ -28807,7 +28822,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR 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_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -28883,32 +28898,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); @@ -28928,7 +28946,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31075,7 +31093,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON property = EX_CONSTANT(opline->op2); - container = NULL; + container = _get_obj_zval_ptr_unused(execute_data); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { zend_throw_error(NULL, "Using $this when not in object context"); @@ -31119,32 +31137,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -31163,7 +31184,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31195,7 +31216,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON property = EX_CONSTANT(opline->op2); - container = NULL; + container = _get_obj_zval_ptr_unused(execute_data); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { zend_throw_error(NULL, "Using $this when not in object context"); @@ -31239,32 +31260,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -31283,7 +31307,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -34201,7 +34225,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - container = NULL; + container = _get_obj_zval_ptr_unused(execute_data); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { zend_throw_error(NULL, "Using $this when not in object context"); @@ -34245,32 +34269,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -34289,7 +34316,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -34321,7 +34348,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - container = NULL; + container = _get_obj_zval_ptr_unused(execute_data); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { zend_throw_error(NULL, "Using $this when not in object context"); @@ -34365,32 +34392,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -34409,7 +34439,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36533,7 +36563,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - container = NULL; + container = _get_obj_zval_ptr_unused(execute_data); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { zend_throw_error(NULL, "Using $this when not in object context"); zval_ptr_dtor_nogc(free_op2); @@ -36577,32 +36607,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); zval_ptr_dtor_nogc(free_op2); @@ -36621,7 +36654,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36653,7 +36686,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - container = NULL; + container = _get_obj_zval_ptr_unused(execute_data); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { zend_throw_error(NULL, "Using $this when not in object context"); zval_ptr_dtor_nogc(free_op2); @@ -36697,32 +36730,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); zval_ptr_dtor_nogc(free_op2); @@ -36741,7 +36777,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval_ptr_dtor_nogc(free_op2); - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -42703,32 +42739,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -42747,7 +42786,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -42823,32 +42862,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -42867,7 +42909,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44011,6 +44053,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_STATIC_SPEC_CV_CONST_HAND GC_REFCOUNT(ref) = 2; GC_TYPE_INFO(ref) = IS_REFERENCE; ZVAL_COPY_VALUE(&ref->val, value); + ref->type = NULL; Z_REF_P(value) = ref; Z_TYPE_INFO_P(value) = IS_REFERENCE_EX; ZVAL_REF(variable_ptr, ref); @@ -50112,32 +50155,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -50156,7 +50202,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -50232,32 +50278,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -50276,7 +50325,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -54535,32 +54584,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); zval_ptr_dtor_nogc(free_op2); @@ -54579,7 +54631,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -54655,32 +54707,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); zval_ptr_dtor_nogc(free_op2); @@ -54699,7 +54754,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval_ptr_dtor_nogc(free_op2); - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) From bb230fd817ad117873c2ec94edcb9ea86bf76d6e Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 18 Nov 2016 01:56:49 +0100 Subject: [PATCH 211/369] Add more guards for typed by-ref assign + fixes --- Zend/tests/bug69732.phpt | 21 +- .../typed_properties_044.phpt | 18 +- .../typed_properties_061.phpt | 58 + .../typed_properties_062.phpt | 64 + .../typed_properties_063.phpt | 63 + .../typed_properties_064.phpt | 63 + .../typed_properties_065.phpt | 55 + Zend/zend_execute.c | 195 ++- Zend/zend_execute.h | 10 +- Zend/zend_types.h | 4 +- Zend/zend_vm_def.h | 146 +- Zend/zend_vm_execute.h | 1415 +++++++++++------ ext/standard/array.c | 7 +- ext/standard/type.c | 2 +- 14 files changed, 1490 insertions(+), 631 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_061.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_062.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_063.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_064.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_065.phpt diff --git a/Zend/tests/bug69732.phpt b/Zend/tests/bug69732.phpt index 8d5fccd71211..4503235f53d3 100644 --- a/Zend/tests/bug69732.phpt +++ b/Zend/tests/bug69732.phpt @@ -17,15 +17,14 @@ function ret_assoc() { $wpq = new wpq; $wpq->interesting =& ret_assoc(); -$x = $wpq->interesting; -printf("%s\n", $x); +$x = &$wpq->interesting; +var_dump($x); +?> --EXPECTF-- -Notice: Undefined property: wpq::$interesting in %sbug69732.php on line 6 - -Notice: Indirect modification of overloaded property wpq::$interesting has no effect in %sbug69732.php on line 16 - -Fatal error: Uncaught Error: Cannot assign by reference to overloaded object in %s:%d -Stack trace: -#0 {main} - thrown in %s on line %d - +Notice: Only variables should be assigned by reference in %s on line %d +array(2) { + ["foo"]=> + string(3) "bar" + [0]=> + string(3) "XXX" +} diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt index 3e75a071f505..a0eec85b5160 100644 --- a/Zend/tests/type_declarations/typed_properties_044.phpt +++ b/Zend/tests/type_declarations/typed_properties_044.phpt @@ -29,19 +29,12 @@ try { echo $e->getMessage() . "\n"; } +/* (1 << 63) - 1 overflows to float, which is exactly convertible back to (1 << 63) */ $bar = PHP_INT_MIN; -try { - var_dump($bar--); -} catch (Throwable $e) { - echo $e->getMessage() . "\n"; -} +var_dump($bar--); +var_dump(--$bar); -try { - var_dump(--$bar); -} catch (Throwable $e) { - echo $e->getMessage() . "\n"; -} ?> --EXPECT-- int(0) @@ -50,6 +43,5 @@ int(-1) int(-1) Cannot assign float to reference of type ?integer Cannot assign float to reference of type ?integer -Cannot assign float to reference of type ?integer -Cannot assign float to reference of type ?integer - +int(-9223372036854775808) +int(-9223372036854775808) 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 000000000000..144a759c317e --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_061.phpt @@ -0,0 +1,58 @@ +--TEST-- +Typed property on overloaded by-ref property +--FILE-- +foo; + } + + function __set($x, $y) { + print "ERROR: __set() called on by-ref __get()"; + } +}; + +$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_MAX; + +try { + $a->_++; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +try { + ++$a->_; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +?> +--EXPECT-- +int(2) +int(21) +Cannot assign string to reference of type integer +int(21) +int(20) +int(19) +Cannot assign float to reference of type integer +int(9223372036854775807) +Cannot assign float to reference of type integer +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 000000000000..bacbe35be106 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_062.phpt @@ -0,0 +1,64 @@ +--TEST-- +Typed property on by-ref property +--FILE-- +_ = &$a->foo; + +$a->_ += 1; +var_dump($a->foo); + +$a->_ .= "1"; +var_dump($a->foo); + +try { + $a->_ .= "e50"; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$a->_--; +var_dump($a->foo); + +--$a->_; +var_dump($a->foo); + +$a->foo = PHP_INT_MAX; + +try { + $a->_++; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +try { + ++$a->_; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +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 of type integer +int(21) +int(20) +int(19) +Cannot assign float to reference of type integer +int(9223372036854775807) +Cannot assign float to reference of type integer +int(9223372036854775807) +Cannot assign array to reference of type integer +int(9223372036854775807) +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 000000000000..8f9985662639 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_063.phpt @@ -0,0 +1,63 @@ +--TEST-- +Typed property on by-ref variable +--FILE-- +foo; + +$_ += 1; +var_dump($a->foo); + +$_ .= "1"; +var_dump($a->foo); + +try { + $_ .= "e50"; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$_--; +var_dump($a->foo); + +--$_; +var_dump($a->foo); + +$a->foo = PHP_INT_MAX; + +try { + $_++; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +try { + ++$_; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +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 of type integer +int(21) +int(20) +int(19) +Cannot assign float to reference of type integer +int(9223372036854775807) +Cannot assign float to reference of type integer +int(9223372036854775807) +Cannot assign array to reference of type integer +int(9223372036854775807) +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 000000000000..241125ffb1ea --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_064.phpt @@ -0,0 +1,63 @@ +--TEST-- +Typed property on by-ref array value +--FILE-- +foo]; + +$_[0] += 1; +var_dump($a->foo); + +$_[0] .= "1"; +var_dump($a->foo); + +try { + $_[0] .= "e50"; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$_[0]--; +var_dump($a->foo); + +--$_[0]; +var_dump($a->foo); + +$a->foo = PHP_INT_MAX; + +try { + $_[0]++; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +try { + ++$_[0]; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +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 of type integer +int(21) +int(20) +int(19) +Cannot assign float to reference of type integer +int(9223372036854775807) +Cannot assign float to reference of type integer +int(9223372036854775807) +Cannot assign array to reference of type integer +int(9223372036854775807) +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 000000000000..e19852ba1ee3 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_065.phpt @@ -0,0 +1,55 @@ +--TEST-- +Typed property on by-ref array dimension +--FILE-- +foo; } + function offsetSet($o, $v) { print "offsetSet() must not be called"; } + function offsetUnset($o) { print "offsetUnset() ?!?"; } +}; + +$a[0] += 1; +var_dump($a->foo); + +$a[0] .= "1"; +var_dump($a->foo); + +try { + $a[0] .= "e50"; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$a[0]--; +var_dump($a->foo); + +--$a[0]; +var_dump($a->foo); + +$a->foo = PHP_INT_MAX; + +try { + $a[0]++; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +try { + ++$a[0]; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +?> +--EXPECT-- +int(2) +int(21) +Cannot assign string to reference of type integer +int(21) +int(20) +int(19) +Cannot assign float to reference of type integer +int(9223372036854775807) +Cannot assign float to reference of type integer +int(9223372036854775807) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 8a13c4bb5510..cb3bcf19f0ee 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -954,7 +954,7 @@ zval* zend_verify_property_type(zend_property_info *info, zval *property, zval * return i_zend_verify_property_type(info, property, tmp, strict); } -static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(void *type, zval *zv, zend_bool strict) { +static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(zend_reftype type, zval *zv, zend_bool strict) { zend_uchar cur_type; if (!type) { @@ -980,7 +980,7 @@ static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(void return zend_verify_scalar_type_hint(cur_type, zv, zv, strict); } -ZEND_API zend_bool zend_verify_ref_type_assignable_zval(void *type, zval *zv, zend_bool strict) +ZEND_API zend_bool zend_verify_ref_type_assignable_zval(zend_reftype type, zval *zv, zend_bool strict) { return i_zend_verify_ref_type_assignable_zval(type, zv, strict); } @@ -1243,15 +1243,32 @@ 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 (UNEXPECTED(Z_ISREF_P(z))) { + zend_reftype type = Z_REFTYPE_P(z); + zval *ref = Z_REFVAL_P(z); + binary_op(&res, ref, value); + if (type && !zend_verify_ref_type_assignable_zval(type, &res, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { + zend_throw_ref_type_error(type, &res); + zval_ptr_dtor(&res); + if (z == &rv) { + zval_ptr_dtor(&rv); + } + return; + } + zval_ptr_dtor(ref); + ZVAL_COPY(ref, &res); + } else { + binary_op(&res, z, value); + Z_OBJ_HT_P(object)->write_dimension(object, property, &res); + } if (z == &rv) { zval_ptr_dtor(&rv); } if (retval) { - ZVAL_COPY(retval, &res); + ZVAL_COPY_VALUE(retval, &res); + } else { + zval_ptr_dtor(&res); } - zval_ptr_dtor(&res); } else { zend_error(E_WARNING, "Attempt to assign property of non-object"); if (retval) { @@ -1490,7 +1507,7 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, { if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) { zval rv, obj; - zval *z; + zval *z, *tmp; zval z_copy; ZVAL_OBJ(&obj, Z_OBJ_P(object)); @@ -1510,21 +1527,42 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, ZVAL_COPY_VALUE(z, value); } - if (UNEXPECTED(Z_TYPE_P(z) == IS_REFERENCE)) { - ZVAL_COPY(result, Z_REFVAL_P(z)); + if (UNEXPECTED(Z_ISREF_P(z))) { + zend_reftype ref_type = Z_REFTYPE_P(z); + tmp = Z_REFVAL_P(z); + ZVAL_COPY(result, tmp); + zend_property_info *prop_info; + + if (inc) { + increment_function(tmp); + } else { + decrement_function(tmp); + } + + if (UNEXPECTED(ref_type || (prop_info = zend_object_fetch_property_type_info(Z_OBJCE(obj), Z_STR_P(property), NULL)))) { + /* ref types are always stricter than prop types */ + if (UNEXPECTED(ref_type ? !zend_verify_ref_type_assignable_zval(ref_type, tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))) : !zend_verify_property_type(prop_info, &z_copy, &z_copy, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { + if (ref_type) { + zend_throw_ref_type_error(ref_type, tmp); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), tmp); + } + zval_ptr_dtor(tmp); + ZVAL_COPY_VALUE(tmp, result); + } + } } else { ZVAL_COPY(result, z); + if (inc) { + increment_function(z); + } else { + decrement_function(z); + } + Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); + zval_ptr_dtor(z); } - ZVAL_DUP(&z_copy, result); - 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); + OBJ_RELEASE(Z_OBJ(obj)); } else { zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); ZVAL_NULL(result); @@ -1537,7 +1575,6 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) { zval *z, obj; - zend_property_info *prop_info; ZVAL_OBJ(&obj, Z_OBJ_P(object)); Z_ADDREF(obj); @@ -1557,37 +1594,51 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, ZVAL_COPY_VALUE(z, value); } - prop_info = zend_object_fetch_property_type_info(Z_OBJCE(obj), Z_STR_P(property), NULL); + if (UNEXPECTED(Z_ISREF_P(z))) { /* binary ops on &__get() should not be written again */ + zend_property_info *prop_info; + zend_reftype ref_type = Z_REFTYPE_P(z); + zval *tmp = Z_REFVAL_P(z); - if (UNEXPECTED(prop_info)) { - /* special case for typed properties */ - zval z_copy; + if (UNEXPECTED(ref_type || (prop_info = zend_object_fetch_property_type_info(Z_OBJCE(obj), Z_STR_P(property), NULL)))) { + /* special case for typed values */ + zval z_copy; - ZVAL_DUP(&z_copy, z); + ZVAL_COPY(&z_copy, tmp); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + + /* ref types are always stricter than prop types */ + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))) : zend_verify_property_type(prop_info, &z_copy, &z_copy, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))) != NULL)) { + zval_ptr_dtor(tmp); + ZVAL_COPY_VALUE(tmp, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + if (inc) { + increment_function(tmp); + } else { + decrement_function(tmp); + } + } + } else { if (inc) { - increment_function(&z_copy); + increment_function(z); } else { - decrement_function(&z_copy); + decrement_function(z); } - if (UNEXPECTED(result)) { - ZVAL_COPY(result, &z_copy); + Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); + if (UNEXPECTED(result) && EXPECTED(!EG(exception))) { + ZVAL_COPY(result, z); } - Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot); - OBJ_RELEASE(Z_OBJ(obj)); - zval_ptr_dtor(&z_copy); - return; - } - - ZVAL_DEREF(z); - SEPARATE_ZVAL_NOREF(z); - if (inc) { - increment_function(z); - } else { - decrement_function(z); - } - Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); - if (UNEXPECTED(result) && EXPECTED(!EG(exception))) { - ZVAL_COPY(result, z); } OBJ_RELEASE(Z_OBJ(obj)); zval_ptr_dtor(z); @@ -1602,8 +1653,7 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, static zend_never_inline void zend_assign_op_overloaded_property(zval *object, zval *property, void **cache_slot, zval *value, binary_op_type binary_op, zval *result) { zval *z; - zval rv, obj; - zval *zptr; + zval rv, obj, z_copy; zend_property_info *prop_info; ZVAL_OBJ(&obj, Z_OBJ_P(object)); @@ -1626,30 +1676,47 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z prop_info = zend_object_fetch_property_type_info(Z_OBJCE(obj), Z_STR_P(property), NULL); - if (UNEXPECTED(prop_info)) { - /* special case for typed properties */ - zval z_copy; + if (UNEXPECTED(Z_ISREF_P(z))) { /* binary ops on &__get() should not be written again */ + zend_reftype ref_type = Z_REFTYPE_P(z); + zval *tmp = Z_REFVAL_P(z); - ZVAL_DUP(&z_copy, z); - binary_op(&z_copy, &z_copy, value); - Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot); - if (UNEXPECTED(result) && EXPECTED(!EG(exception))) { - ZVAL_COPY(result, z); + if (UNEXPECTED(ref_type || prop_info)) { + /* special case for typed values */ + binary_op(&z_copy, tmp, value); + + /* ref types are always stricter than prop types */ + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))) : zend_verify_property_type(prop_info, &z_copy, &z_copy, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))) != NULL)) { + zval_ptr_dtor(tmp); + ZVAL_COPY_VALUE(tmp, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + SEPARATE_ZVAL_NOREF(tmp); + binary_op(tmp, tmp, value); + } + } else { + if (UNEXPECTED(prop_info)) { + binary_op(&z_copy, z, value); + Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot); + zval_ptr_dtor(z); + z = &z_copy; + } else { + SEPARATE_ZVAL_NOREF(z); + binary_op(z, z, value); + Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); } - zval_ptr_dtor(&z_copy); - OBJ_RELEASE(Z_OBJ(obj)); - return; } - zptr = z; - ZVAL_DEREF(z); - SEPARATE_ZVAL_NOREF(z); - binary_op(z, z, value); - Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); - if (UNEXPECTED(result)) { + if (UNEXPECTED(result) && EXPECTED(!EG(exception))) { ZVAL_COPY(result, z); } - zval_ptr_dtor(zptr); + zval_ptr_dtor(z); } else { zend_error(E_WARNING, "Attempt to assign property of non-object"); if (UNEXPECTED(result)) { diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 50c01d5a255a..b9583ff054e1 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -56,7 +56,7 @@ ZEND_API void ZEND_FASTCALL zend_check_internal_arg_type(zend_function *zf, uint ZEND_API int ZEND_FASTCALL zend_check_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot); ZEND_API ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(zend_execute_data *execute_data); -static zend_always_inline void *zend_get_prop_info_ref_type(zend_property_info *prop_info) { +static zend_always_inline zend_reftype zend_get_prop_info_ref_type(zend_property_info *prop_info) { if (prop_info->type == IS_OBJECT && UNEXPECTED(!prop_info->type_ce)) { if (zend_string_equals_literal_ci(prop_info->type_name, "self")) { prop_info->type_ce = prop_info->ce; @@ -75,19 +75,19 @@ static zend_always_inline void *zend_get_prop_info_ref_type(zend_property_info * } } - return (void *) (((prop_info->type & ~IS_OBJECT) << 1) | prop_info->allow_null | (uintptr_t) prop_info->type_ce); + return (zend_reftype) (((prop_info->type & ~IS_OBJECT) << 1) | prop_info->allow_null | (uintptr_t) prop_info->type_ce); } /* do not call when new_type == IS_REFERENCE or new_type == IS_OBJECT! */ -static zend_always_inline zend_bool zend_verify_ref_type_assignable(void *type, zend_uchar new_type) { +static zend_always_inline zend_bool zend_verify_ref_type_assignable(zend_reftype type, zend_uchar new_type) { zend_uchar cur_type = ((uintptr_t) type) >> 1; return new_type == cur_type || ((0x1 & (uintptr_t) type) && new_type == IS_NULL) || (new_type == _IS_BOOL && (cur_type == IS_FALSE || cur_type == IS_TRUE)); } -ZEND_API zend_bool zend_verify_ref_type_assignable_zval(void *type, zval *zv, zend_bool strict); -ZEND_API ZEND_COLD void zend_throw_ref_type_error(void *type, zval *zv); +ZEND_API zend_bool zend_verify_ref_type_assignable_zval(zend_reftype type, zval *zv, zend_bool strict); +ZEND_API ZEND_COLD void zend_throw_ref_type_error(zend_reftype type, zval *zv); static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type, zend_bool strict) { diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 7f483d495724..6ba91ef76a7b 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -289,10 +289,12 @@ struct _zend_resource { void *ptr; }; +typedef void * zend_reftype; + struct _zend_reference { zend_refcounted_h gc; zval val; - zend_class_entry *type; + zend_reftype type; }; struct _zend_ast_ref { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index a77085b4303e..da22df937c75 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -807,7 +807,12 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if (OP2_TYPE == IS_CONST) { @@ -815,19 +820,21 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -880,13 +887,36 @@ 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); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (OP2_TYPE != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + FREE_OP2(); + FREE_OP(free_op_data1); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if (OP2_TYPE != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -968,7 +998,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_helper, VAR|CV, CONST|TMPVAR|CV, binary_op_ zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -1273,7 +1303,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -1287,30 +1317,37 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if (OP2_TYPE == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -1397,7 +1434,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -1411,7 +1448,12 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if (OP2_TYPE == IS_CONST) { @@ -1419,9 +1461,9 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -1429,12 +1471,16 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -1507,7 +1553,7 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -1570,7 +1616,7 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -1597,7 +1643,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr, *val; - void *type = NULL; + zend_reftype type = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1627,7 +1673,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) increment_function(var_ptr); - if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); @@ -1642,7 +1688,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - void *type = NULL; + zend_reftype type = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1672,7 +1718,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) decrement_function(var_ptr); - if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); @@ -2513,7 +2559,7 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( } ZEND_VM_C_LABEL(fast_assign_obj): - value = zend_assign_to_variable(property, value, OP_DATA_TYPE, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -2635,7 +2681,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array): } } value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); - value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -2710,7 +2756,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -2741,7 +2787,7 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC) HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, OP2_TYPE, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, OP2_TYPE, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -2840,7 +2886,7 @@ ZEND_VM_HANDLER(100, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -2867,7 +2913,7 @@ ZEND_VM_HANDLER(100, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); FREE_OP1_VAR_PTR(); @@ -2878,7 +2924,9 @@ ZEND_VM_HANDLER(100, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -6552,7 +6600,7 @@ ZEND_VM_C_LABEL(fe_fetch_r_exit): if (EXPECTED(OP2_TYPE == IS_CV)) { zval *variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op2.var); - zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index d5cf21a464d7..2e117cc73d5f 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -15558,7 +15558,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -15569,12 +15569,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -15619,7 +15621,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -15630,12 +15632,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -15680,7 +15684,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -15691,12 +15695,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -15741,7 +15747,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -15752,12 +15758,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -15777,7 +15785,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr, *val; - void *type = NULL; + zend_reftype type = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -15798,7 +15806,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -15807,7 +15815,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND increment_function(var_ptr); - if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); @@ -15822,7 +15830,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr; - void *type = NULL; + zend_reftype type = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -15843,7 +15851,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -15852,7 +15860,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND decrement_function(var_ptr); - if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); @@ -16978,7 +16986,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE if (EXPECTED(opline->op2_type == IS_CV)) { zval *variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op2.var); - zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); @@ -17596,7 +17604,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if (IS_CONST == IS_CONST) { @@ -17604,19 +17617,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -17669,13 +17684,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if (IS_CONST != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -17745,7 +17783,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V } else { void *type = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -17756,7 +17794,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -18516,7 +18554,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -18530,30 +18568,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -18639,7 +18684,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -18653,7 +18698,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if (IS_CONST == IS_CONST) { @@ -18661,9 +18711,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -18671,12 +18721,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -19072,7 +19126,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19248,7 +19302,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19424,7 +19478,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19600,7 +19654,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19722,7 +19776,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -19813,7 +19867,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -19905,7 +19959,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -19997,7 +20051,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -20071,7 +20125,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -20099,7 +20153,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -20183,7 +20237,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -20210,7 +20264,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -20221,7 +20275,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -20307,7 +20363,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -20334,7 +20390,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -20345,7 +20401,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -21036,7 +21094,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -21064,7 +21122,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -21264,7 +21322,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -21292,7 +21350,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -21323,7 +21381,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -21516,13 +21574,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if (IS_UNUSED != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -21909,7 +21990,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -22000,7 +22081,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -22092,7 +22173,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -22184,7 +22265,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -22839,7 +22920,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if (IS_CV == IS_CONST) { @@ -22847,19 +22933,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -22912,13 +23000,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_CV != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if (IS_CV != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -22988,7 +23099,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V } else { void *type = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -22999,7 +23110,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -23759,7 +23870,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -23773,30 +23884,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -23882,7 +24000,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -23896,7 +24014,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if (IS_CV == IS_CONST) { @@ -23904,9 +24027,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -23914,12 +24037,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -24315,7 +24442,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24491,7 +24618,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24667,7 +24794,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24843,7 +24970,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24965,7 +25092,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -25056,7 +25183,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -25148,7 +25275,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -25240,7 +25367,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -25314,7 +25441,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -25342,7 +25469,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -25373,7 +25500,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -25471,7 +25598,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -25498,7 +25625,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25509,7 +25636,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -25595,7 +25724,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -25622,7 +25751,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25633,7 +25762,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -26238,7 +26369,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -26246,19 +26382,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -26311,13 +26449,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + zval_ptr_dtor_nogc(free_op2); + FREE_OP(free_op_data1); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -26388,7 +26549,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V } else { void *type = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -26399,7 +26560,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -27160,7 +27321,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -27174,30 +27335,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -27284,7 +27452,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -27298,7 +27466,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -27306,9 +27479,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -27316,12 +27489,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -27719,7 +27896,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27895,7 +28072,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28071,7 +28248,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28247,7 +28424,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28369,7 +28546,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -28460,7 +28637,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -28552,7 +28729,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -28644,7 +28821,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -28774,7 +28951,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -28801,7 +28978,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -28812,7 +28989,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -28898,7 +29077,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -28925,7 +29104,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -28936,7 +29115,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -29586,7 +29767,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if (IS_CONST == IS_CONST) { @@ -29594,19 +29780,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -29911,7 +30099,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -29925,30 +30113,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -30034,7 +30229,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -30048,7 +30243,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if (IS_CONST == IS_CONST) { @@ -30056,9 +30256,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -30066,12 +30266,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -30448,7 +30652,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -30624,7 +30828,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -30800,7 +31004,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -30976,7 +31180,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -31137,7 +31341,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -31164,7 +31368,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -31175,7 +31379,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -31260,7 +31466,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -31287,7 +31493,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -31298,7 +31504,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -32718,7 +32926,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if (IS_CV == IS_CONST) { @@ -32726,19 +32939,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -33043,7 +33258,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -33057,30 +33272,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -33166,7 +33388,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -33180,7 +33402,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if (IS_CV == IS_CONST) { @@ -33188,9 +33415,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -33198,12 +33425,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -33580,7 +33811,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -33756,7 +33987,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -33932,7 +34163,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -34108,7 +34339,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -34269,7 +34500,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -34296,7 +34527,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -34307,7 +34538,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -34392,7 +34625,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -34419,7 +34652,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -34430,7 +34663,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -35052,7 +35287,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -35060,19 +35300,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -35377,7 +35619,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -35391,30 +35633,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -35501,7 +35750,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -35515,7 +35764,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -35523,9 +35777,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -35533,12 +35787,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -35918,7 +36176,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -36094,7 +36352,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -36270,7 +36528,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -36446,7 +36704,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -36607,7 +36865,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -36634,7 +36892,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -36645,7 +36903,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -36730,7 +36990,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -36757,7 +37017,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -36768,7 +37028,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -37279,7 +37541,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -37290,12 +37552,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -37339,7 +37603,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -37350,12 +37614,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -37399,7 +37665,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -37410,12 +37676,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -37459,7 +37727,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -37470,12 +37738,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -37494,7 +37764,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr, *val; - void *type = NULL; + zend_reftype type = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); @@ -37515,7 +37785,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -37524,7 +37794,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ increment_function(var_ptr); - if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); @@ -37538,7 +37808,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr; - void *type = NULL; + zend_reftype type = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); @@ -37559,7 +37829,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -37568,7 +37838,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ decrement_function(var_ptr); - if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); @@ -39880,7 +40150,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if (IS_CONST == IS_CONST) { @@ -39888,19 +40163,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -39953,13 +40230,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if (IS_CONST != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -40029,7 +40329,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C } else { void *type = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -40040,7 +40340,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -40800,7 +41100,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -40814,30 +41114,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -40923,7 +41230,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -40937,7 +41244,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if (IS_CONST == IS_CONST) { @@ -40945,9 +41257,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -40955,12 +41267,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -41628,7 +41944,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -41804,7 +42120,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -41980,7 +42296,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42156,7 +42472,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42278,7 +42594,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -42369,7 +42685,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -42461,7 +42777,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -42553,7 +42869,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -42627,7 +42943,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -42655,7 +42971,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -42739,7 +43055,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -42766,7 +43082,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -42777,7 +43093,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -42862,7 +43180,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -42889,7 +43207,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -42900,7 +43218,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -44169,7 +44489,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -44197,7 +44517,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -44533,7 +44853,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -44561,7 +44881,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -44592,7 +44912,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -44971,13 +45291,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if (IS_UNUSED != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -45661,7 +46004,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -45752,7 +46095,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -45844,7 +46187,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -45936,7 +46279,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -47389,7 +47732,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if (IS_CV == IS_CONST) { @@ -47397,19 +47745,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -47462,13 +47812,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_CV != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if (IS_CV != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -47538,7 +47911,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C } else { void *type = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -47549,7 +47922,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -48309,7 +48682,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -48323,30 +48696,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -48432,7 +48812,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -48446,7 +48826,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if (IS_CV == IS_CONST) { @@ -48454,9 +48839,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -48464,12 +48849,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -49000,7 +49389,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49176,7 +49565,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49352,7 +49741,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49528,7 +49917,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49650,7 +50039,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -49741,7 +50130,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -49833,7 +50222,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -49925,7 +50314,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -49999,7 +50388,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -50027,7 +50416,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, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -50058,7 +50447,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER( HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -50155,7 +50544,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -50182,7 +50571,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -50193,7 +50582,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -50278,7 +50669,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -50305,7 +50696,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -50316,7 +50707,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -51912,7 +52305,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -51920,19 +52318,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -51985,13 +52385,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + zval_ptr_dtor_nogc(free_op2); + FREE_OP(free_op_data1); + + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -52062,7 +52485,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C } else { void *type = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -52073,7 +52496,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -52834,7 +53257,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -52848,30 +53271,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -52958,7 +53388,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -52972,7 +53402,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -52980,9 +53415,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -52990,12 +53425,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -53529,7 +53968,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -53705,7 +54144,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -53881,7 +54320,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -54057,7 +54496,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -54179,7 +54618,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -54270,7 +54709,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -54362,7 +54801,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -54454,7 +54893,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + 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); } @@ -54584,7 +55023,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -54611,7 +55050,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -54622,7 +55061,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -54707,7 +55148,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -54734,7 +55175,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -54745,7 +55186,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { diff --git a/ext/standard/array.c b/ext/standard/array.c index 4e006db8b985..f3a7f4de84cd 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2801,7 +2801,7 @@ PHP_FUNCTION(array_splice) length = 0; int num_in; /* Number of elements in the input array */ - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a/l|lt", &array, &offset, &length, &repl_array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a/l|lz/", &array, &offset, &length, &repl_array) == FAILURE) { return; } @@ -2811,6 +2811,11 @@ PHP_FUNCTION(array_splice) length = num_in; } + if (ZEND_NUM_ARGS() == 4) { + /* Make sure the last argument, if passed, is an array */ + convert_to_array_ex(repl_array); + } + /* Don't create the array of removed elements if it's not going * to be used; e.g. only removing and/or replacing elements */ if (USED_RET()) { diff --git a/ext/standard/type.c b/ext/standard/type.c index 0e0c6f506d70..bfc3523b2314 100644 --- a/ext/standard/type.c +++ b/ext/standard/type.c @@ -371,10 +371,10 @@ PHP_FUNCTION(is_callable) //??? is it necessary to be consistent with old PHP ("\0" support) if (UNEXPECTED(ZSTR_LEN(name) != strlen(ZSTR_VAL(name)))) { ZEND_TRY_ASSIGN_STRINGL(callable_name, ZSTR_VAL(name), strlen(ZSTR_VAL(name))); - zend_string_release(name); } else { ZEND_TRY_ASSIGN_STR(callable_name, name); } + zend_string_release(name); } else { retval = zend_is_callable_ex(var, NULL, check_flags, NULL, NULL, &error); } From 38583b951aa8e5fcd1dcbc5ee814d44eb6075b56 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 18 Nov 2016 13:59:31 +0100 Subject: [PATCH 212/369] Fix a few more tests --- Zend/zend_vm_def.h | 10 +++++++- Zend/zend_vm_execute.h | 36 ++++++++++++++++++++++++++-- ext/intl/formatter/formatter_parse.c | 16 +++++-------- ext/pcntl/pcntl.c | 8 +++---- ext/standard/dns.c | 2 +- ext/standard/fsock.c | 25 +++++++++---------- ext/xml/xml.c | 2 +- tests/classes/array_access_012.phpt | 2 +- 8 files changed, 67 insertions(+), 34 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index da22df937c75..02034d8b9739 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2778,7 +2778,15 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC) value_ptr = GET_OP2_ZVAL_PTR_PTR(BP_VAR_W); variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); - if (OP2_TYPE == IS_VAR && + if (OP1_TYPE == IS_VAR && + UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR_P(variable_ptr)) && + UNEXPECTED(!Z_ISREF_P(variable_ptr))) { + zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object"); + FREE_OP1_VAR_PTR(); + FREE_OP2_VAR_PTR(); + HANDLE_EXCEPTION(); + } else if (OP2_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 2e117cc73d5f..81f1b7645281 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -21373,6 +21373,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); if (IS_VAR == IS_VAR && + UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR_P(variable_ptr)) && + UNEXPECTED(!Z_ISREF_P(variable_ptr))) { + zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);}; + HANDLE_EXCEPTION(); + } else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); @@ -25491,7 +25499,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op2.var); variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_CV == IS_VAR && + if (IS_VAR == IS_VAR && + UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR_P(variable_ptr)) && + UNEXPECTED(!Z_ISREF_P(variable_ptr))) { + zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + HANDLE_EXCEPTION(); + } else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); @@ -44903,7 +44919,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER value_ptr = _get_zval_ptr_ptr_var(opline->op2.var, execute_data, &free_op2); variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_VAR == IS_VAR && + if (IS_CV == IS_VAR && + UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR_P(variable_ptr)) && + UNEXPECTED(!Z_ISREF_P(variable_ptr))) { + zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object"); + + if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);}; + HANDLE_EXCEPTION(); + } else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); @@ -50439,6 +50463,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER( variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); if (IS_CV == IS_VAR && + UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR_P(variable_ptr)) && + UNEXPECTED(!Z_ISREF_P(variable_ptr))) { + zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object"); + + + HANDLE_EXCEPTION(); + } else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); diff --git a/ext/intl/formatter/formatter_parse.c b/ext/intl/formatter/formatter_parse.c index 9b9705f7b0f8..a1b87a50bfcf 100644 --- a/ext/intl/formatter/formatter_parse.c +++ b/ext/intl/formatter/formatter_parse.c @@ -51,7 +51,7 @@ PHP_FUNCTION( numfmt_parse ) FORMATTER_METHOD_INIT_VARS; /* Parse parameters. */ - if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Os|ll!", + if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Os|lz!", &object, NumberFormatter_ce_ptr, &str, &str_len, &type, &zposition ) == FAILURE ) { intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, @@ -61,7 +61,7 @@ PHP_FUNCTION( numfmt_parse ) } if(zposition) { - position = (int32_t)Z_LVAL_P( zposition ); + position = (int32_t) zval_get_long(zposition); position_p = &position; } @@ -105,8 +105,7 @@ PHP_FUNCTION( numfmt_parse ) efree(oldlocale); #endif if(zposition) { - zval_dtor(zposition); - ZVAL_LONG(zposition, position); + ZEND_TRY_ASSIGN_LONG(zposition, position); } if (sstr) { @@ -137,7 +136,7 @@ PHP_FUNCTION( numfmt_parse_currency ) FORMATTER_METHOD_INIT_VARS; /* Parse parameters. */ - if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Osz/|z/!", + if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Osz/|z!", &object, NumberFormatter_ce_ptr, &str, &str_len, &zcurrency, &zposition ) == FAILURE ) { intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, @@ -154,16 +153,13 @@ PHP_FUNCTION( numfmt_parse_currency ) INTL_METHOD_CHECK_STATUS( nfo, "String conversion to UTF-16 failed" ); if(zposition) { - ZVAL_DEREF(zposition); - convert_to_long(zposition); - position = (int32_t)Z_LVAL_P( zposition ); + position = (int32_t) zend_get_long(zposition); position_p = &position; } number = unum_parseDoubleCurrency(FORMATTER_OBJECT(nfo), sstr, sstr_len, position_p, currency, &INTL_DATA_ERROR_CODE(nfo)); if(zposition) { - zval_dtor(zposition); - ZVAL_LONG(zposition, position); + ZEND_TRY_ASSIGN_LONG(zposition, position); } if (sstr) { efree(sstr); diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index aa77ba4c8388..1db6c1a245a3 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -656,7 +656,7 @@ PHP_FUNCTION(pcntl_waitpid) struct rusage rusage; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz|lt/", &pid, &z_status, &options, &z_rusage) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz|lt", &pid, &z_status, &options, &z_rusage) == FAILURE) { return; } @@ -1081,7 +1081,7 @@ PHP_FUNCTION(pcntl_sigprocmask) zval *user_set, *user_oldset = NULL, *user_signo; sigset_t set, oldset; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "la|t/", &how, &user_set, &user_oldset) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "la|t", &how, &user_set, &user_oldset) == FAILURE) { return; } @@ -1137,11 +1137,11 @@ static void pcntl_sigwaitinfo(INTERNAL_FUNCTION_PARAMETERS, int timedwait) /* {{ struct timespec timeout; if (timedwait) { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|t/ll", &user_set, &user_siginfo, &tv_sec, &tv_nsec) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|tll", &user_set, &user_siginfo, &tv_sec, &tv_nsec) == FAILURE) { return; } } else { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|t/", &user_set, &user_siginfo) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|t", &user_set, &user_siginfo) == FAILURE) { return; } } diff --git a/ext/standard/dns.c b/ext/standard/dns.c index 1be28bad5c42..2c7e084572df 100644 --- a/ext/standard/dns.c +++ b/ext/standard/dns.c @@ -1013,7 +1013,7 @@ PHP_FUNCTION(dns_get_mx) struct __res_state *handle = &state; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "st/|t/", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "st|t", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { return; } diff --git a/ext/standard/fsock.c b/ext/standard/fsock.c index 561d259d0681..2a1624100774 100644 --- a/ext/standard/fsock.c +++ b/ext/standard/fsock.c @@ -76,15 +76,6 @@ static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent) #endif tv.tv_usec = conv % 1000000; - if (zerrno) { - zval_dtor(zerrno); - ZVAL_LONG(zerrno, 0); - } - if (zerrstr) { - zval_dtor(zerrstr); - ZVAL_EMPTY_STRING(zerrstr); - } - stream = php_stream_xport_create(hostname, hostname_len, REPORT_ERRORS, STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT, hashkey, &tv, NULL, &errstr, &err); @@ -103,17 +94,23 @@ static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent) if (zerrno) { ZEND_TRY_ASSIGN_LONG(zerrno, err); } - if (zerrstr && errstr) { - /* no need to dup; we need to efree buf anyway */ - zval_dtor(zerrstr); - ZVAL_STR(zerrstr, errstr); - } else if (!zerrstr && errstr) { + if (errstr) { + if (zerrstr) { + ZEND_TRY_ASSIGN_STR(zerrstr, errstr); + } zend_string_release(errstr); } RETURN_FALSE; } + if (zerrno) { + ZEND_TRY_ASSIGN_LONG(zerrno, 0); + } + if (zerrstr) { + ZEND_TRY_ASSIGN_EMPTY_STRING(zerrstr); + } + if (errstr) { zend_string_release(errstr); } diff --git a/ext/xml/xml.c b/ext/xml/xml.c index ed8d29723920..9566ac5207c0 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -1412,7 +1412,7 @@ PHP_FUNCTION(xml_parse_into_struct) size_t data_len; int ret; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rst/|t/", &pind, &data, &data_len, &xdata, &info) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rst|t", &pind, &data, &data_len, &xdata, &info) == FAILURE) { return; } diff --git a/tests/classes/array_access_012.phpt b/tests/classes/array_access_012.phpt index 1fe0b248658b..4d7980640167 100644 --- a/tests/classes/array_access_012.phpt +++ b/tests/classes/array_access_012.phpt @@ -33,7 +33,7 @@ $data['element'] = &$test; Notice: Indirect modification of overloaded element of ArrayAccessImpl has no effect in %sarray_access_012.php on line 24 -Fatal error: Uncaught Error: Cannot assign by reference to overloaded object in %sarray_access_012.php:24 +Fatal error: Uncaught Error: Cannot assign by reference to an array dimension of an object in %sarray_access_012.php:24 Stack trace: #0 {main} thrown in %sarray_access_012.php on line 24 From fea2aa8a183928d5caea9168343b2195a7fc4f18 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 18 Nov 2016 15:24:58 +0100 Subject: [PATCH 213/369] typo; s/zend_get_long/zval_get_long/ --- ext/intl/formatter/formatter_parse.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/intl/formatter/formatter_parse.c b/ext/intl/formatter/formatter_parse.c index a1b87a50bfcf..491680cc2033 100644 --- a/ext/intl/formatter/formatter_parse.c +++ b/ext/intl/formatter/formatter_parse.c @@ -153,7 +153,7 @@ PHP_FUNCTION( numfmt_parse_currency ) INTL_METHOD_CHECK_STATUS( nfo, "String conversion to UTF-16 failed" ); if(zposition) { - position = (int32_t) zend_get_long(zposition); + position = (int32_t) zval_get_long(zposition); position_p = &position; } From d9b964e6c7e6576ff13d8bde4c44ddc000dfd0d6 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 19 Nov 2016 14:26:53 +0100 Subject: [PATCH 214/369] Fix iterator_035.phpt and pcntl/003.phpt --- ext/pcntl/pcntl.c | 18 ++++++------------ ext/spl/tests/iterator_035.phpt | 2 +- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index 1db6c1a245a3..5a0ea6bb2b54 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -664,10 +664,8 @@ PHP_FUNCTION(pcntl_waitpid) #ifdef HAVE_WAIT4 if (z_rusage) { - if (Z_TYPE_P(z_rusage) != IS_ARRAY) { - zval_dtor(z_rusage); - array_init(z_rusage); - } + zval_dtor(z_rusage); + array_init(z_rusage); memset(&rusage, 0, sizeof(struct rusage)); child_id = wait4((pid_t) pid, &status, options, &rusage); @@ -1107,10 +1105,8 @@ PHP_FUNCTION(pcntl_sigprocmask) } if (user_oldset != NULL) { - if (Z_TYPE_P(user_oldset) != IS_ARRAY) { - zval_dtor(user_oldset); - array_init(user_oldset); - } + zval_dtor(user_oldset); + array_init(user_oldset); for (signo = 1; signo < MAX(NSIG-1, SIGRTMAX); ++signo) { if (sigismember(&oldset, signo) != 1) { @@ -1205,10 +1201,8 @@ PHP_FUNCTION(pcntl_sigtimedwait) static void pcntl_siginfo_to_zval(int signo, siginfo_t *siginfo, zval *user_siginfo) /* {{{ */ { if (signo > 0 && user_siginfo) { - if (Z_TYPE_P(user_siginfo) != IS_ARRAY) { - zval_dtor(user_siginfo); - array_init(user_siginfo); - } + zval_dtor(user_siginfo); + array_init(user_siginfo); add_assoc_long_ex(user_siginfo, "signo", sizeof("signo")-1, siginfo->si_signo); add_assoc_long_ex(user_siginfo, "errno", sizeof("errno")-1, siginfo->si_errno); diff --git a/ext/spl/tests/iterator_035.phpt b/ext/spl/tests/iterator_035.phpt index 307337431ab5..37cba36a67e8 100644 --- a/ext/spl/tests/iterator_035.phpt +++ b/ext/spl/tests/iterator_035.phpt @@ -14,7 +14,7 @@ echo "Done\n"; --EXPECTF-- Notice: Indirect modification of overloaded element of ArrayIterator has no effect in %s on line %d -Fatal error: Uncaught Error: Cannot assign by reference to overloaded object in %s:%d +Fatal error: Uncaught Error: Cannot assign by reference to an array dimension of an object in %s:%d Stack trace: #0 {main} thrown in %s on line %d From 0cc95b84d5d31f33ee5080116dca0f81d501cdac Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 19 Nov 2016 14:45:02 +0100 Subject: [PATCH 215/369] Remove lchown($file, -5); test Some operating systems choose to return EINVAL for users (and groups) out of range (e.g. user ids must not be negative) instead of EPERM. This thus cannot be deterministically tested for all systems - and we are anyway already testing the branch with errno with the inexistent filename (ENOENT) - thus no problem removing it. --- ext/standard/tests/file/lchown_error.phpt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/ext/standard/tests/file/lchown_error.phpt b/ext/standard/tests/file/lchown_error.phpt index 8632495b3979..aabf661793ff 100644 --- a/ext/standard/tests/file/lchown_error.phpt +++ b/ext/standard/tests/file/lchown_error.phpt @@ -43,9 +43,6 @@ var_dump( lchown( 'foobar_lchown.txt', $uid ) ); var_dump( lchown( new StdClass(), $uid ) ); var_dump( lchown( array(), $uid ) ); -// Bad user -var_dump( lchown( $filename, -5 ) ); - ?> ===DONE=== --CLEAN-- @@ -72,7 +69,4 @@ bool(true) Warning: lchown() expects parameter 1 to be a valid path, array given in %s on line %d bool(true) - -Warning: lchown(): %r(Operation not permitted|Invalid argument)%r in %s on line %d -bool(false) ===DONE=== From d5b3bd8bdbe578c06b4f975fc9edce38bc7e6257 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 19 Nov 2016 18:23:33 +0100 Subject: [PATCH 216/369] Add support for by-ref foreach --- .../typed_properties_012.phpt | 19 ++-- .../typed_properties_045.phpt | 29 ++++-- Zend/zend_vm_def.h | 35 +++----- Zend/zend_vm_execute.h | 89 +++---------------- 4 files changed, 52 insertions(+), 120 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_012.phpt b/Zend/tests/type_declarations/typed_properties_012.phpt index 185dc3e96146..79a77cfa40dc 100644 --- a/Zend/tests/type_declarations/typed_properties_012.phpt +++ b/Zend/tests/type_declarations/typed_properties_012.phpt @@ -1,5 +1,5 @@ --TEST-- -Test typed properties disallow fetch reference for foreach +Test typed properties allow fetch reference for foreach --FILE-- ---EXPECTF-- -Fatal error: Uncaught TypeError: Typed properties exist in Foo: foreach by reference is disallowed in %s:7 -Stack trace: -#0 {main} - thrown in %s on line 7 - - +--EXPECT-- +object(Foo)#1 (1) { + ["bar"]=> + &int(2) +} diff --git a/Zend/tests/type_declarations/typed_properties_045.phpt b/Zend/tests/type_declarations/typed_properties_045.phpt index 6218564bf88b..a70eaf198ae8 100644 --- a/Zend/tests/type_declarations/typed_properties_045.phpt +++ b/Zend/tests/type_declarations/typed_properties_045.phpt @@ -1,15 +1,30 @@ --TEST-- -foreach() leaks on object with typed properties +foreach() must return properly typed references --FILE-- getMessage() . "\n"; +foreach ($foo = new Foo as $k => &$val) { + var_dump($val); + + $val = 20; + var_dump($foo->$k); + + try { + $val = []; + var_dump($foo->$k); + } catch (Throwable $e) { + echo $e->getMessage(), "\n"; + } } +?> --EXPECT-- -Typed properties exist in Foo: foreach by reference is disallowed +int(0) +int(20) +Cannot assign array to reference of type integer +float(0.5) +float(20) +Cannot assign array to reference of type float diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 02034d8b9739..db0aa7c7a50e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -6315,20 +6315,6 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) FREE_OP1_VAR_PTR(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { -ZEND_VM_C_LABEL(fe_reset_rw_typed): - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Typed properties exist in %s: foreach by reference is disallowed", - ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); - if (OP1_TYPE == IS_VAR) { - FREE_OP1_VAR_PTR(); - } else { - FREE_OP1(); - } - HANDLE_EXCEPTION(); - } - if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) { if (array_ptr == array_ref) { @@ -6375,10 +6361,6 @@ ZEND_VM_C_LABEL(fe_reset_rw_typed): zend_object_iterator *iter; zend_bool is_empty; - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { - ZEND_VM_C_GOTO(fe_reset_rw_typed); - } - iter = ce->get_iterator(ce, array_ptr, 1); if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { @@ -6706,18 +6688,21 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR) } else if (UNEXPECTED(value_type == IS_INDIRECT)) { value = Z_INDIRECT_P(value); value_type = Z_TYPE_INFO_P(value); - if (UNEXPECTED(value_type == IS_UNDEF)) { + if (UNEXPECTED(value_type == IS_UNDEF) || UNEXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) != SUCCESS)) { pos++; p++; continue; } + if ((value_type & Z_TYPE_MASK) != IS_REFERENCE) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(array), p->key, NULL); + if (UNEXPECTED(prop_info)) { + ZVAL_NEW_REF(value, value); + Z_REFTYPE_P(value) = zend_get_prop_info_ref_type(prop_info); + value_type = IS_REFERENCE_EX; + } + } } - if (UNEXPECTED(!p->key) || - EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) == SUCCESS)) { - break; - } - pos++; - p++; + break; } if (opline->result_type & (IS_TMP_VAR|IS_CV)) { if (UNEXPECTED(!p->key)) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 81f1b7645281..cd8869291500 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3665,20 +3665,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { -fe_reset_rw_typed: - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Typed properties exist in %s: foreach by reference is disallowed", - ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); - if (IS_CONST == IS_VAR) { - - } else { - - } - HANDLE_EXCEPTION(); - } - if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (IS_CONST == IS_VAR || IS_CONST == IS_CV) { if (array_ptr == array_ref) { @@ -3724,10 +3710,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER zend_object_iterator *iter; zend_bool is_empty; - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { - goto fe_reset_rw_typed; - } - iter = ce->get_iterator(ce, array_ptr, 1); if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { @@ -12994,20 +12976,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_TMP_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { -fe_reset_rw_typed: - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Typed properties exist in %s: foreach by reference is disallowed", - ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); - if (IS_TMP_VAR == IS_VAR) { - - } else { - zval_ptr_dtor_nogc(free_op1); - } - HANDLE_EXCEPTION(); - } - if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) { if (array_ptr == array_ref) { @@ -13053,10 +13021,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z zend_object_iterator *iter; zend_bool is_empty; - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { - goto fe_reset_rw_typed; - } - iter = ce->get_iterator(ce, array_ptr, 1); if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { @@ -16693,20 +16657,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { -fe_reset_rw_typed: - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Typed properties exist in %s: foreach by reference is disallowed", - ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); - if (IS_VAR == IS_VAR) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - } else { - zval_ptr_dtor_nogc(free_op1); - } - HANDLE_EXCEPTION(); - } - if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (IS_VAR == IS_VAR || IS_VAR == IS_CV) { if (array_ptr == array_ref) { @@ -16753,10 +16703,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z zend_object_iterator *iter; zend_bool is_empty; - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { - goto fe_reset_rw_typed; - } - iter = ce->get_iterator(ce, array_ptr, 1); if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { @@ -17084,18 +17030,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z } else if (UNEXPECTED(value_type == IS_INDIRECT)) { value = Z_INDIRECT_P(value); value_type = Z_TYPE_INFO_P(value); - if (UNEXPECTED(value_type == IS_UNDEF)) { + if (UNEXPECTED(value_type == IS_UNDEF) || UNEXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) != SUCCESS)) { pos++; p++; continue; } + if ((value_type & Z_TYPE_MASK) != IS_REFERENCE) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(array), p->key, NULL); + if (UNEXPECTED(prop_info)) { + ZVAL_NEW_REF(value, value); + Z_REFTYPE_P(value) = zend_get_prop_info_ref_type(prop_info); + value_type = IS_REFERENCE_EX; + } + } } - if (UNEXPECTED(!p->key) || - EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) == SUCCESS)) { - break; - } - pos++; - p++; + break; } if (opline->result_type & (IS_TMP_VAR|IS_CV)) { if (UNEXPECTED(!p->key)) { @@ -38896,20 +38845,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { -fe_reset_rw_typed: - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Typed properties exist in %s: foreach by reference is disallowed", - ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); - if (IS_CV == IS_VAR) { - - } else { - - } - HANDLE_EXCEPTION(); - } - if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (IS_CV == IS_VAR || IS_CV == IS_CV) { if (array_ptr == array_ref) { @@ -38955,10 +38890,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE zend_object_iterator *iter; zend_bool is_empty; - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { - goto fe_reset_rw_typed; - } - iter = ce->get_iterator(ce, array_ptr, 1); if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { From 0bf02dccfbd3186b37cbc0ea95cd148f751bdeac Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 1 Dec 2016 17:20:46 +0100 Subject: [PATCH 217/369] Separate static property assignment out into dedicated assign ops --- Zend/zend_compile.c | 25 +- Zend/zend_execute.c | 76 + Zend/zend_vm_def.h | 190 +- Zend/zend_vm_execute.h | 4496 +++++++++++++++++----- Zend/zend_vm_gen.php | 16 +- Zend/zend_vm_opcodes.c | 28 +- Zend/zend_vm_opcodes.h | 1 + ext/opcache/Optimizer/compact_literals.c | 5 + ext/opcache/Optimizer/zend_dump.c | 2 + ext/opcache/Optimizer/zend_optimizer.c | 20 + 10 files changed, 3812 insertions(+), 1047 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 3fe46292f2d3..506559098286 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2958,13 +2958,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_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); + 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); @@ -3073,13 +3082,23 @@ 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_compile_expr(&expr_node, expr_ast); zend_delayed_compile_end(offset); zend_emit_op(result, opcode, &var_node, &expr_node); return; + case ZEND_AST_STATIC_PROP: + offset = zend_delayed_compile_begin(); + zend_delayed_compile_var(result, var_ast, BP_VAR_RW); + zend_compile_expr(&expr_node, expr_ast); + + opline = zend_delayed_compile_end(offset); + opline->opcode = opcode; + opline->extended_value = 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_RW); @@ -3089,7 +3108,7 @@ void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */ opline->opcode = opcode; opline->extended_value = ZEND_ASSIGN_DIM; - opline = zend_emit_op_data(&expr_node); + zend_emit_op_data(&expr_node); return; case ZEND_AST_PROP: offset = zend_delayed_compile_begin(); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index a2df1ef0485e..ea3330e4bdbd 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2005,6 +2005,82 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } } +static zend_always_inline zval *zend_fetch_static_prop_address(zend_execute_data *execute_data, zval *varname, uint32_t varname_op_type, const znode_op *class, uint32_t class_op_type, void **polymorphic_cache_slot, void **ce_cache_slot) +{ + zval *retval; + zend_string *name; + zend_class_entry *ce; + + if (varname_op_type == IS_CONST) { + name = Z_STR_P(varname); + } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { + name = Z_STR_P(varname); + zend_string_addref(name); + } else { + if (varname_op_type == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { + zval_undefined_cv(EX(opline)->op1.var, execute_data); + } + name = zval_get_string(varname); + } + + if (class_op_type == IS_CONST) { + if (polymorphic_cache_slot && EXPECTED((ce = CACHED_PTR_EX(polymorphic_cache_slot)) != NULL)) { + retval = CACHED_PTR_EX(polymorphic_cache_slot + 1); + /* check if static properties were destoyed */ + if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { + zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); + return NULL; + } else { + return retval; + } + } else if (ce_cache_slot && UNEXPECTED((ce = CACHED_PTR_EX(ce_cache_slot)) == NULL)) { + ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(*class)), EX_CONSTANT(*class) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); + if (UNEXPECTED(ce == NULL)) { + ZEND_ASSERT(EG(exception)); + if (varname_op_type != IS_CONST) { + zend_string_release(name); + } + return NULL; + } + CACHE_PTR_EX(ce_cache_slot, ce); + } + } else { + if (class_op_type == IS_UNUSED) { + ce = zend_fetch_class(NULL, class->num); + if (UNEXPECTED(ce == NULL)) { + ZEND_ASSERT(EG(exception)); + if (varname_op_type != IS_CONST) { + zend_string_release(name); + } + return NULL; + } + } else { + ce = Z_CE_P(EX_VAR(class->var)); + } + if (varname_op_type == IS_CONST && (retval = CACHED_POLYMORPHIC_PTR_EX(polymorphic_cache_slot, ce)) != NULL) { + /* check if static properties were destoyed */ + if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { + zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); + return NULL; + } else { + return retval; + } + } + } + + retval = zend_std_get_static_property(ce, name, 0); + + if (varname_op_type != IS_CONST) { + zend_string_release(name); + } + + if (retval && polymorphic_cache_slot) { + CACHE_POLYMORPHIC_PTR_EX(polymorphic_cache_slot, ce, retval); + } + + return retval; +} + #if ZEND_INTENSIVE_DEBUGGING #define CHECK_SYMBOL_TABLES() \ diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b73f2e512437..208361c7e94e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -824,6 +824,42 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, ZEND_VM_NEXT_OPCODE_EX(1, 2); } +ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSED|CONST|TMPVAR, binary_op_type binary_op) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op1, free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R); + + retval = zend_fetch_static_prop_address(execute_data, varname, OP1_TYPE, &opline->op2, OP2_TYPE, (OP1_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + FREE_OP1(); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + FREE_OP1(); + /* 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) { USE_OPLINE @@ -945,10 +981,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) +ZEND_VM_INLINE_HELPER(zend_binary_assign_op_helper, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(DIM_OBJ), binary_op_type binary_op) { -#if defined(ZEND_VM_SPEC) && OP2_TYPE == IS_UNUSED - ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_dim_helper, binary_op, binary_op); +#if defined(ZEND_VM_SPEC) && (OP1_TYPE == IS_CONST || OP1_TYPE == IS_TMP_VAR) + ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_static_prop_helper, binary_op, binary_op); +#elif defined(ZEND_VM_SPEC) && (OP2_TYPE == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(opline->extended_value == ZEND_ASSIGN_DIM)) { + ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_dim_helper, binary_op, binary_op); + } + + ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_static_prop_helper, binary_op, binary_op); #else # if !defined(ZEND_VM_SPEC) || OP1_TYPE != IS_UNUSED USE_OPLINE @@ -959,68 +1003,73 @@ ZEND_VM_INLINE_HELPER(zend_binary_assign_op_helper, VAR|UNUSED|THIS|CV, CONST|TM if (EXPECTED(opline->extended_value == ZEND_ASSIGN_DIM)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_dim_helper, binary_op, binary_op); } +# if !defined(ZEND_VM_SPEC) || OP2_TYPE == IS_CONST || OP2_TYPE == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(opline->extended_value == ZEND_ASSIGN_STATIC_PROP)) { + ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_static_prop_helper, binary_op, binary_op); + } +# endif # endif ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_obj_helper, binary_op, binary_op); #endif } -ZEND_VM_HANDLER(23, ZEND_ASSIGN_ADD, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(23, ZEND_ASSIGN_ADD, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, add_function); } -ZEND_VM_HANDLER(24, ZEND_ASSIGN_SUB, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(24, ZEND_ASSIGN_SUB, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, sub_function); } -ZEND_VM_HANDLER(25, ZEND_ASSIGN_MUL, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(25, ZEND_ASSIGN_MUL, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, mul_function); } -ZEND_VM_HANDLER(26, ZEND_ASSIGN_DIV, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(26, ZEND_ASSIGN_DIV, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, div_function); } -ZEND_VM_HANDLER(27, ZEND_ASSIGN_MOD, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(27, ZEND_ASSIGN_MOD, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, mod_function); } -ZEND_VM_HANDLER(28, ZEND_ASSIGN_SL, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(28, ZEND_ASSIGN_SL, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, shift_left_function); } -ZEND_VM_HANDLER(29, ZEND_ASSIGN_SR, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(29, ZEND_ASSIGN_SR, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, shift_right_function); } -ZEND_VM_HANDLER(30, ZEND_ASSIGN_CONCAT, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(30, ZEND_ASSIGN_CONCAT, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, concat_function); } -ZEND_VM_HANDLER(31, ZEND_ASSIGN_BW_OR, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(31, ZEND_ASSIGN_BW_OR, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, bitwise_or_function); } -ZEND_VM_HANDLER(32, ZEND_ASSIGN_BW_AND, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(32, ZEND_ASSIGN_BW_AND, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, bitwise_and_function); } -ZEND_VM_HANDLER(33, ZEND_ASSIGN_BW_XOR, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(33, ZEND_ASSIGN_BW_XOR, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, bitwise_xor_function); } -ZEND_VM_HANDLER(167, ZEND_ASSIGN_POW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(167, ZEND_ASSIGN_POW, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, pow_function); } @@ -1520,95 +1569,19 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, zend_free_op free_op1; zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); 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); - zend_string_addref(name); - } else { - if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (OP2_TYPE == IS_CONST) { - if (OP1_TYPE == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - FREE_OP1(); - HANDLE_EXCEPTION(); - } - - ZEND_VM_C_GOTO(fetch_static_prop_return); - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (OP1_TYPE != IS_CONST) { - zend_string_release(name); - } - FREE_OP1(); - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (OP2_TYPE == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (OP1_TYPE != IS_CONST) { - zend_string_release(name); - } - FREE_OP1(); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (OP1_TYPE == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - FREE_OP1(); - HANDLE_EXCEPTION(); - } - - ZEND_VM_C_GOTO(fetch_static_prop_return); - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, OP1_TYPE, &opline->op2, OP2_TYPE, (OP1_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if (OP1_TYPE != IS_CONST) { - zend_string_release(name); - } FREE_OP1(); HANDLE_EXCEPTION(); } - if (OP1_TYPE == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } - + FREE_OP1(); - if (OP1_TYPE != IS_CONST) { - zend_string_release(name); - } - -ZEND_VM_C_LABEL(fetch_static_prop_return): if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -2224,6 +2197,36 @@ ZEND_VM_C_LABEL(exit_assign_obj): ZEND_VM_NEXT_OPCODE_EX(1, 2); } +ZEND_VM_HANDLER(185, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, SPEC(OP_DATA=CONST|TMP|VAR|CV)) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R); + + retval = zend_fetch_static_prop_address(execute_data, varname, OP1_TYPE, &opline->op2, OP2_TYPE, (OP1_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + FREE_OP1(); + FREE_UNFETCHED_OP_DATA(); + HANDLE_EXCEPTION(); + } + + value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); + value = zend_assign_to_variable(retval, value, OP_DATA_TYPE); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP1(); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(OP_DATA=CONST|TMP|VAR|CV)) { USE_OPLINE @@ -2278,7 +2281,6 @@ ZEND_VM_C_LABEL(try_assign_dim_array): if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - FREE_OP_DATA(); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (OP2_TYPE == IS_UNUSED) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6850ec3d6e3e..15c380b48359 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4817,99 +4817,152 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_CONST_HAND ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CONST_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CONST_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { - USE_OPLINE + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + USE_OPLINE + zend_free_op free_op_data1; zval *varname; - zval *retval; - zend_string *name; - zend_class_entry *ce; + zval *retval, *value; SAVE_OPLINE(); varname = EX_CONSTANT(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); - zend_string_addref(name); - } else { - if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_CONST, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); } - if (IS_CONST == IS_CONST) { - if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } + FREE_OP(free_op_data1); - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_CONST == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CONST == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } - HANDLE_EXCEPTION(); - } + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CONST != IS_UNUSED + USE_OPLINE - goto fetch_static_prop_return; - } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } - retval = zend_std_get_static_property(ce, name, 0); +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CONST_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + + zval *varname; + zval *retval; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_CONST, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } HANDLE_EXCEPTION(); } - if (IS_CONST == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } - - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -5235,6 +5288,122 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_CONST_CONST_HA ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_CONST, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_CONST, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_CONST, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_CONST, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + 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_FAST_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -6676,93 +6845,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); varname = EX_CONSTANT(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); - zend_string_addref(name); - } else { - if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (IS_VAR == IS_CONST) { - if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_VAR == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CONST == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_VAR, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } HANDLE_EXCEPTION(); } - if (IS_CONST == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } - - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -6807,6 +6900,122 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_CONS ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_VAR(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_VAR, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_VAR, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_VAR, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_VAR, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + 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_UNSET_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -7082,6 +7291,135 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(Z ZEND_VM_RETURN(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CONST_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_UNUSED, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + + /* 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_CONST_UNUSED_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CONST != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -7248,93 +7586,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); varname = EX_CONSTANT(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); - zend_string_addref(name); - } else { - if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (IS_UNUSED == IS_CONST) { - if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_UNUSED == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CONST == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_UNUSED, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } HANDLE_EXCEPTION(); } - if (IS_CONST == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } - - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -7416,6 +7678,122 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_UNUSED, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_UNUSED, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_UNUSED, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_UNUSED, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + 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_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -10838,6 +11216,135 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_TMPVAR_HAN ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CONST_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, (IS_TMP_VAR|IS_VAR), (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + + /* 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_CONST_TMPVAR_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CONST != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -13363,6 +13870,135 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONS ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_TMP_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op1, free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_TMP_VAR, &opline->op2, IS_CONST, (IS_TMP_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + zval_ptr_dtor_nogc(free_op1); + /* 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_TMP_CONST_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_TMP_VAR != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -14198,6 +14834,135 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEN ZEND_VM_RETURN(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_TMP_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op1, free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_TMP_VAR, &opline->op2, IS_UNUSED, (IS_TMP_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + zval_ptr_dtor_nogc(free_op1); + /* 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_TMP_UNUSED_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_TMP_VAR != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -15112,6 +15877,135 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_LEXICAL_SPEC_TMP_CV_HANDL ZEND_VM_NEXT_OPCODE(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_TMP_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op1, free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_TMP_VAR, &opline->op2, (IS_TMP_VAR|IS_VAR), (IS_TMP_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + zval_ptr_dtor_nogc(free_op1); + /* 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_TMP_TMPVAR_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_TMP_VAR != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -17428,6 +18322,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op1, free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_VAR, &opline->op2, IS_CONST, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + 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) { USE_OPLINE @@ -17549,8 +18479,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -17561,6 +18499,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17569,8 +18512,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CONST_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -17581,6 +18532,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17589,8 +18545,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -17601,6 +18565,44 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_VAR != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17622,6 +18624,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17637,6 +18644,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17652,6 +18664,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17667,6 +18684,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17682,6 +18704,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17697,6 +18724,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17712,6 +18744,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17727,6 +18764,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17742,6 +18784,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_OB ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17757,6 +18804,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17772,6 +18824,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17787,6 +18844,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -18988,7 +20050,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_CONST == IS_UNUSED) { @@ -19080,7 +20141,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_CONST == IS_UNUSED) { @@ -20402,6 +21462,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEN ZEND_VM_RETURN(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op1, free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_VAR, &opline->op2, IS_UNUSED, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + 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_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -20493,8 +21589,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_UNUSED == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -20505,6 +21609,44 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_VAR != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -20516,61 +21658,121 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_DIM ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -20789,7 +21991,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_UNUSED == IS_UNUSED) { @@ -20881,7 +22082,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_UNUSED == IS_UNUSED) { @@ -21746,8 +22946,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -21758,6 +22966,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -21766,8 +22979,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CV_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -21778,6 +22999,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -21786,8 +23012,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CV_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -21798,6 +23032,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -23185,7 +24424,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_CV == IS_UNUSED) { @@ -23277,7 +24515,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_CV == IS_UNUSED) { @@ -24126,6 +25363,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op1, free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_VAR, &opline->op2, (IS_TMP_VAR|IS_VAR), (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + zval_ptr_dtor_nogc(free_op1); + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -24249,8 +25522,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -24261,6 +25542,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24269,8 +25555,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -24281,6 +25575,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24289,8 +25588,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -24301,6 +25608,44 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_VAR != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24322,6 +25667,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24337,6 +25687,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24352,6 +25707,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24367,6 +25727,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24382,6 +25747,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24397,6 +25767,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24412,6 +25787,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24427,6 +25807,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24442,6 +25827,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24457,6 +25847,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24472,6 +25867,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24487,6 +25887,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -25691,7 +27096,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { @@ -25783,7 +27187,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { @@ -26568,8 +27971,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_UNUSED != IS_UNUSED USE_OPLINE @@ -26580,6 +27991,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -29110,8 +30526,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_UNUSED_CV_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_UNUSED != IS_UNUSED USE_OPLINE @@ -29122,6 +30546,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -30854,8 +32283,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_UNUSED != IS_UNUSED USE_OPLINE @@ -30866,6 +32303,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -34947,6 +36389,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_CONST, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -35068,8 +36546,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -35080,6 +36566,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35088,8 +36579,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CONST_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -35100,6 +36599,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35108,8 +36612,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -35120,6 +36632,44 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CV != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35141,6 +36691,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35156,6 +36711,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35171,6 +36731,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35186,6 +36751,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35201,6 +36771,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35216,6 +36791,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CONST_OBJ_HA ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35231,6 +36811,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CONST_OBJ_HA ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35246,6 +36831,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_OB ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35261,6 +36851,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35276,6 +36871,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_OB ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35291,6 +36891,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_OB ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35306,6 +36911,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -35463,93 +37073,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); varname = _get_zval_ptr_cv_undef(execute_data, 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); - zend_string_addref(name); - } else { - if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (IS_CONST == IS_CONST) { - if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_CONST == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CV == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_CONST, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } HANDLE_EXCEPTION(); } - if (IS_CV == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } - if (IS_CV != IS_CONST) { - zend_string_release(name); - } - -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -36634,6 +38168,122 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_CONST, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_CONST, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_CONST, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_CONST, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -36779,7 +38429,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_CONST == IS_UNUSED) { @@ -36871,7 +38520,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_CONST == IS_UNUSED) { @@ -38527,93 +40175,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); varname = _get_zval_ptr_cv_undef(execute_data, 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); - zend_string_addref(name); - } else { - if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (IS_VAR == IS_CONST) { - if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_VAR == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CV == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_VAR, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } HANDLE_EXCEPTION(); } - if (IS_CV == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } - if (IS_CV != IS_CONST) { - zend_string_release(name); - } - -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -38658,6 +40230,122 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_V ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_VAR(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_VAR, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_VAR, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_VAR, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_VAR, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -39092,6 +40780,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND ZEND_VM_RETURN(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_UNUSED, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -39183,8 +40907,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_UNUSED == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -39195,6 +40927,44 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CV != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -39206,61 +40976,121 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_DIM_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -39427,93 +41257,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); varname = _get_zval_ptr_cv_undef(execute_data, 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); - zend_string_addref(name); - } else { - if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (IS_UNUSED == IS_CONST) { - if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_UNUSED == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CV == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_UNUSED, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } HANDLE_EXCEPTION(); } - if (IS_CV == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } - - if (IS_CV != IS_CONST) { - zend_string_release(name); - } -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -39631,6 +41385,122 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNU ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_UNUSED, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_UNUSED, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_UNUSED, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_UNUSED, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -39776,7 +41646,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_UNUSED == IS_UNUSED) { @@ -39868,7 +41737,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_UNUSED == IS_UNUSED) { @@ -41531,8 +43399,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -41543,6 +43419,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -41551,8 +43432,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CV_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -41563,6 +43452,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -41571,8 +43465,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -41583,6 +43485,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -43105,7 +45012,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_CV == IS_UNUSED) { @@ -43197,7 +45103,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_CV == IS_UNUSED) { @@ -45037,6 +46942,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, (IS_TMP_VAR|IS_VAR), (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -45160,8 +47101,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -45172,6 +47121,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45180,8 +47134,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -45192,6 +47154,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45200,8 +47167,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -45212,6 +47187,44 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CV != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45233,6 +47246,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45248,6 +47266,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45263,6 +47286,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45278,6 +47306,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45293,6 +47326,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45308,6 +47346,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45323,6 +47366,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45338,6 +47386,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45353,6 +47406,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OB ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45368,6 +47426,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45383,6 +47446,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45398,6 +47466,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -46738,7 +48811,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { @@ -46830,7 +48902,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { @@ -48896,95 +50967,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ zend_free_op free_op1; zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - zend_string_addref(name); - } else { - if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (IS_CONST == IS_CONST) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_CONST == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_CONST, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } zval_ptr_dtor_nogc(free_op1); HANDLE_EXCEPTION(); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } zval_ptr_dtor_nogc(free_op1); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -49164,6 +51159,126 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_TMPVAR_CONST_H ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_CONST, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_CONST, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_CONST, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_CONST, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -49845,95 +51960,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ zend_free_op free_op1; zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - zend_string_addref(name); - } else { - if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (IS_VAR == IS_CONST) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_VAR == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_VAR, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } zval_ptr_dtor_nogc(free_op1); HANDLE_EXCEPTION(); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } zval_ptr_dtor_nogc(free_op1); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -49978,6 +52017,126 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPV ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_VAR, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_VAR, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_VAR, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_VAR, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -50333,95 +52492,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ zend_free_op free_op1; zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - zend_string_addref(name); - } else { - if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (IS_UNUSED == IS_CONST) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_UNUSED == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_UNUSED, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } zval_ptr_dtor_nogc(free_op1); HANDLE_EXCEPTION(); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } zval_ptr_dtor_nogc(free_op1); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -50466,6 +52549,126 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPV ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_UNUSED, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_UNUSED, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_UNUSED, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_UNUSED, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -54736,13 +56939,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -54750,15 +56959,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -54766,45 +56979,59 @@ void zend_init_opcodes_handlers(void) ZEND_ASSIGN_ADD_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CV_OBJ_HANDLER, @@ -54812,13 +57039,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -54826,60 +57059,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_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_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CV_OBJ_HANDLER, @@ -54887,13 +57139,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -54901,60 +57159,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, 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_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CV_OBJ_HANDLER, @@ -54962,13 +57239,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -54976,60 +57259,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_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_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CV_OBJ_HANDLER, @@ -55037,13 +57339,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -55051,60 +57359,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, 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_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CV_OBJ_HANDLER, @@ -55112,14 +57439,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -55127,59 +57459,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_TMP_UNUSED_STATIC_PROP_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_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_SL_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CV_OBJ_HANDLER, @@ -55187,14 +57539,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -55202,59 +57559,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_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_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_SR_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CV_OBJ_HANDLER, @@ -55262,14 +57639,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -55277,59 +57659,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_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_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CV_OBJ_HANDLER, @@ -55337,14 +57739,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -55352,59 +57759,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_TMP_UNUSED_STATIC_PROP_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_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CV_OBJ_HANDLER, @@ -55412,14 +57839,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -55427,59 +57859,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + 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_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CV_OBJ_HANDLER, @@ -55487,14 +57939,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -55502,59 +57959,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_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_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_OBJ_HANDLER, @@ -55562,6 +58039,7 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED_HANDLER, ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_HANDLER, ZEND_NULL_HANDLER, @@ -57435,15 +59913,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_CONST_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -57451,59 +59933,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_TMP_UNUSED_STATIC_PROP_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_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_POW_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CV_OBJ_HANDLER, @@ -57527,6 +60029,7 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_BIND_GLOBAL_SPEC_CV_CONST_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -57868,6 +60371,131 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CV_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -58885,73 +61513,62 @@ void zend_init_opcodes_handlers(void) 461 | SPEC_RULE_OP1, 466 | SPEC_RULE_OP1, 471 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 546 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 621 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 696 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 571 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 671 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, 771 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 846 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 921 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 996 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 871 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 971 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, 1071 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 1146 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 1221 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 1296 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL, - 1306 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL, - 1316 | SPEC_RULE_OP1, - 1321 | SPEC_RULE_OP1, - 1326 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_RETVAL, - 1376 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1401 | SPEC_RULE_OP1, - 1406, - 1407, - 1408 | SPEC_RULE_OP1, - 1413 | SPEC_RULE_OP1, - 1418 | SPEC_RULE_OP1, - 1423 | SPEC_RULE_OP1, - 1428 | SPEC_RULE_OP1, - 1433 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1458 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1483 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, - 1493 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1518 | SPEC_RULE_OP1, - 1523 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1548 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1573 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1598 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1623, - 1624 | SPEC_RULE_OP1, - 1629 | SPEC_RULE_OP2, - 1634 | SPEC_RULE_RETVAL, - 1636 | SPEC_RULE_OP2, - 1641 | SPEC_RULE_OP1, - 1646, - 1647 | SPEC_RULE_OP2, - 1652 | SPEC_RULE_OP1, - 1657 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, - 1667 | SPEC_RULE_OP1, - 1672 | SPEC_RULE_OP1, - 1677 | SPEC_RULE_OP2, - 1682 | SPEC_RULE_OP1, - 1687 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1712 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1737 | SPEC_RULE_OP1, - 1742 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1767 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1792 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1817 | SPEC_RULE_OP1, - 1822 | SPEC_RULE_OP1, - 1827 | SPEC_RULE_OP1, - 1832 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1857 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1882 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1907 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1932 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1957 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1982 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2007 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2032 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2057 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2082 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1171 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 1271 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 1371 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 1471 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 1571 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL, + 1581 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL, + 1591 | SPEC_RULE_OP1, + 1596 | SPEC_RULE_OP1, + 1601 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_RETVAL, + 1651 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1676 | SPEC_RULE_OP1, + 1681, + 1682, + 1683 | SPEC_RULE_OP1, + 1688 | SPEC_RULE_OP1, + 1693 | SPEC_RULE_OP1, + 1698 | SPEC_RULE_OP1, + 1703 | SPEC_RULE_OP1, + 1708 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1733 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1758 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, + 1768 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1793 | SPEC_RULE_OP1, + 1798 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1823 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1848 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1873 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1898, + 1899 | SPEC_RULE_OP1, + 1904 | SPEC_RULE_OP2, + 1909 | SPEC_RULE_RETVAL, + 1911 | SPEC_RULE_OP2, + 1916 | SPEC_RULE_OP1, + 1921, + 1922 | SPEC_RULE_OP2, + 1927 | SPEC_RULE_OP1, + 1932 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, + 1942 | SPEC_RULE_OP1, + 1947 | SPEC_RULE_OP1, + 1952 | SPEC_RULE_OP2, + 1957 | SPEC_RULE_OP1, + 1962 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1987 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2012 | SPEC_RULE_OP1, + 2017 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2042 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2067 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2092 | SPEC_RULE_OP1, + 2097 | SPEC_RULE_OP1, + 2102 | SPEC_RULE_OP1, 2107 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2132 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2157 | SPEC_RULE_OP1 | SPEC_RULE_OP2, @@ -58961,94 +61578,105 @@ void zend_init_opcodes_handlers(void) 2257 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2282 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2307 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 4596, - 2332, - 2333, - 2334, - 2335, - 2336, - 2337 | SPEC_RULE_OP1, - 2342 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2367 | SPEC_RULE_OP1, - 2372 | SPEC_RULE_OP2, - 2377 | SPEC_RULE_OP1, - 2382 | SPEC_RULE_OP1, - 2387 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2412 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2437 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2462 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2487 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, - 2497 | SPEC_RULE_OP1, - 2502 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2527, - 2528 | SPEC_RULE_OP1, - 2533 | SPEC_RULE_OP1, - 2538 | SPEC_RULE_OP1, - 2543 | SPEC_RULE_OP1, - 2548 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2573 | SPEC_RULE_OP1, - 2578 | SPEC_RULE_OP1, - 2583 | SPEC_RULE_OP1, - 2588 | SPEC_RULE_OP2, - 2593 | SPEC_RULE_RETVAL, - 2595 | SPEC_RULE_RETVAL, - 2597 | SPEC_RULE_RETVAL, - 2599 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2624 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2649 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2674 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2699 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 2824, - 2825 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2850, - 2851 | SPEC_RULE_OP2, - 2856, - 2857 | SPEC_RULE_OP1, - 2862 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2887 | SPEC_RULE_OP2, - 2892 | SPEC_RULE_OP2, - 2897, - 2898 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 3023 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3048, - 3049, - 3050, - 3051 | SPEC_RULE_OP1, - 3056 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3081, - 3082, - 3083 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3108, - 3109, - 3110, - 3111 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3136 | SPEC_RULE_OP1, - 3141, - 3142, - 3143, - 3144, - 3145 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3170 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 3245 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3270 | SPEC_RULE_OP1, - 3275 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3300, - 3301 | SPEC_RULE_OP2, - 3306 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2332 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2357 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2382 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2407 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2432 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2457 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2482 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2507 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2532 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2557 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2582 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 5021, + 2607, + 2608, + 2609, + 2610, + 2611, + 2612 | SPEC_RULE_OP1, + 2617 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2642 | SPEC_RULE_OP1, + 2647 | SPEC_RULE_OP2, + 2652 | SPEC_RULE_OP1, + 2657 | SPEC_RULE_OP1, + 2662 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2687 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2712 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2737 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2762 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, + 2772 | SPEC_RULE_OP1, + 2777 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2802, + 2803 | SPEC_RULE_OP1, + 2808 | SPEC_RULE_OP1, + 2813 | SPEC_RULE_OP1, + 2818 | SPEC_RULE_OP1, + 2823 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2848 | SPEC_RULE_OP1, + 2853 | SPEC_RULE_OP1, + 2858 | SPEC_RULE_OP1, + 2863 | SPEC_RULE_OP2, + 2868 | SPEC_RULE_RETVAL, + 2870 | SPEC_RULE_RETVAL, + 2872 | SPEC_RULE_RETVAL, + 2874 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2899 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2924 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2949 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2974 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 3099, + 3100 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3125, + 3126 | SPEC_RULE_OP2, + 3131, + 3132 | SPEC_RULE_OP1, + 3137 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3162 | SPEC_RULE_OP2, + 3167 | SPEC_RULE_OP2, + 3172, + 3173 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 3298 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3323, + 3324, + 3325, + 3326 | SPEC_RULE_OP1, 3331 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3356 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3381 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3406 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3431 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3456 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3481 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3506 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3531 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3556 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3581 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 4596, + 3356, + 3357, + 3358 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3383, + 3384, + 3385, + 3386 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3411 | SPEC_RULE_OP1, + 3416, + 3417, + 3418, + 3419, + 3420 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3445 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 3545 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3570 | SPEC_RULE_OP1, + 3575 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3600, + 3601 | SPEC_RULE_OP2, 3606 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 4596 + 3631 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3656 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3681 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3706 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3731 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3756 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3781 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3806 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3831 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3856 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3881 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3906 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 4031 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 5021 }; zend_opcode_handlers = labels; zend_handlers_count = sizeof(labels) / sizeof(void*); @@ -59125,11 +61753,13 @@ static const void *zend_vm_get_opcode_handler_ex(uint32_t spec, const zend_op* o } } if (spec & SPEC_RULE_DIM_OBJ) { - offset = offset * 3; + offset = offset * 4; if (op->extended_value == ZEND_ASSIGN_DIM) { offset += 1; } else if (op->extended_value == ZEND_ASSIGN_OBJ) { offset += 2; + } else if (op->extended_value == ZEND_ASSIGN_STATIC_PROP) { + offset += 3; } } return zend_opcode_handlers[(spec & SPEC_START_MASK) + offset]; @@ -59155,7 +61785,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3631 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4056 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59163,7 +61793,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3656 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4081 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59171,7 +61801,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3681 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4106 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59182,17 +61812,17 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3706 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4131 | 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 = 3731 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4156 | 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 = 3756 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4181 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_MUL: @@ -59200,7 +61830,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3781 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4206 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59208,7 +61838,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3806 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4231 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59216,7 +61846,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3831 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4256 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59227,7 +61857,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3856 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4281 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59235,7 +61865,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3931 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4356 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59246,7 +61876,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4006 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4431 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59254,7 +61884,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4081 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4506 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59265,12 +61895,12 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4156 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4581 | 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 = 4231 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4656 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_IS_SMALLER_OR_EQUAL: @@ -59278,70 +61908,70 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4306 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4731 | 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 = 4381 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4806 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_QM_ASSIGN: if ((op1_info == MAY_BE_DOUBLE)) { - spec = 4546 | SPEC_RULE_OP1; + spec = 4971 | SPEC_RULE_OP1; } else if ((!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE))))) { - spec = 4551 | SPEC_RULE_OP1; + spec = 4976 | SPEC_RULE_OP1; } break; case ZEND_PRE_INC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4456 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4881 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4466 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4891 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4476 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4901 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } break; case ZEND_PRE_DEC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4486 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4911 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4496 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4921 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4506 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4931 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } break; case ZEND_POST_INC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4516 | SPEC_RULE_OP1; + spec = 4941 | SPEC_RULE_OP1; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4521 | SPEC_RULE_OP1; + spec = 4946 | SPEC_RULE_OP1; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4526 | SPEC_RULE_OP1; + spec = 4951 | SPEC_RULE_OP1; } break; case ZEND_POST_DEC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4531 | SPEC_RULE_OP1; + spec = 4956 | SPEC_RULE_OP1; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4536 | SPEC_RULE_OP1; + spec = 4961 | SPEC_RULE_OP1; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4541 | SPEC_RULE_OP1; + spec = 4966 | SPEC_RULE_OP1; } break; case ZEND_SEND_VAR_EX: if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4586 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG; + spec = 5011 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG; } break; case ZEND_FETCH_DIM_R: if ((!(op2_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)))) { - spec = 4556 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4981 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_SEND_VAR: if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4581 | SPEC_RULE_OP1; + spec = 5006 | SPEC_RULE_OP1; } break; default: diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index d5115c86fb4e..d50cc080fa16 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -739,6 +739,7 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp "/opline->extended_value\s*==\s*0/", "/opline->extended_value\s*==\s*ZEND_ASSIGN_DIM/", "/opline->extended_value\s*==\s*ZEND_ASSIGN_OBJ/", + "/opline->extended_value\s*==\s*ZEND_ASSIGN_STATIC_PROP/", ), array( $op1_type[$op1], @@ -805,6 +806,9 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp isset($extra_spec['DIM_OBJ']) ? ($extra_spec['DIM_OBJ'] == 2 ? "1" : "0") : "\\0", + isset($extra_spec['DIM_OBJ']) ? + ($extra_spec['DIM_OBJ'] == 3 ? "1" : "0") + : "\\0", ), $code); @@ -950,7 +954,9 @@ function skip_extra_spec_function($op1, $op2, $extra_spec) { } if (isset($extra_spec["DIM_OBJ"]) && - (($op2 == "UNUSED" && $extra_spec["DIM_OBJ"] != 1) || + ((($op1 == "CONST" || $op1 == "TMP") && $extra_spec["DIM_OBJ"] != 3) || + ($op2 == "UNUSED" && $extra_spec["DIM_OBJ"] != 1 && $extra_spec["DIM_OBJ"] != 3) || + ($op2 == "CV" && $extra_spec["DIM_OBJ"] == 3) || ($op1 == "UNUSED" && $extra_spec["DIM_OBJ"] != 2))) { // Skip useless handlers return true; @@ -1366,6 +1372,8 @@ function extra_spec_name($extra_spec) { $s .= "_DIM"; } else if ($extra_spec["DIM_OBJ"] == 2) { $s .= "_OBJ"; + } else if ($extra_spec["DIM_OBJ"] == 3) { + $s .= "_STATIC_PROP"; } } return $s; @@ -1912,7 +1920,7 @@ function parse_spec_rules($def, $lineno, $str) { $ret["SMART_BRANCH"] = array(0, 1, 2); break; case "DIM_OBJ": - $ret["DIM_OBJ"] = array(0, 1, 2); + $ret["DIM_OBJ"] = array(0, 1, 2, 3); break; case "NO_CONST_CONST": $ret["NO_CONST_CONST"] = array(1); @@ -2315,11 +2323,13 @@ function gen_vm($def, $skel) { } if (isset($used_extra_spec["DIM_OBJ"])) { out($f, "\tif (spec & SPEC_RULE_DIM_OBJ) {\n"); - out($f, "\t\toffset = offset * 3;\n"); + out($f, "\t\toffset = offset * 4;\n"); out($f, "\t\tif (op->extended_value == ZEND_ASSIGN_DIM) {\n"); out($f, "\t\t\toffset += 1;\n"); out($f, "\t\t} else if (op->extended_value == ZEND_ASSIGN_OBJ) {\n"); out($f, "\t\t\toffset += 2;\n"); + out($f, "\t\t} else if (op->extended_value == ZEND_ASSIGN_STATIC_PROP) {\n"); + out($f, "\t\t\toffset += 3;\n"); out($f, "\t\t}\n"); out($f, "\t}\n"); } diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 06da751d2eef..0c624621fba8 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -207,7 +207,7 @@ static const char *zend_vm_opcodes_names[187] = { "ZEND_BIND_LEXICAL", "ZEND_BIND_STATIC", "ZEND_FETCH_THIS", - NULL, + "ZEND_ASSIGN_STATIC_PROP", "ZEND_ISSET_ISEMPTY_THIS", }; @@ -235,17 +235,17 @@ static uint32_t zend_vm_opcodes_flags[187] = { 0x00000707, 0x07000003, 0x00000003, - 0x04006751, - 0x04006751, - 0x04006751, - 0x04006751, - 0x04006751, - 0x04006751, - 0x04006751, - 0x04006751, - 0x04006751, - 0x04006751, - 0x04006751, + 0x04006753, + 0x04006753, + 0x04006753, + 0x04006753, + 0x04006753, + 0x04006753, + 0x04006753, + 0x04006753, + 0x04006753, + 0x04006753, + 0x04006753, 0x00000001, 0x00000001, 0x00000001, @@ -379,7 +379,7 @@ static uint32_t zend_vm_opcodes_flags[187] = { 0x00000010, 0x00000000, 0x00000707, - 0x04006751, + 0x04006753, 0x00000301, 0x00002003, 0x00000707, @@ -397,7 +397,7 @@ static uint32_t zend_vm_opcodes_flags[187] = { 0x00100101, 0x00100301, 0x00000101, - 0x00000000, + 0x00000307, 0x00000101, }; diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index c55d8a85001a..646734bd504a 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -251,6 +251,7 @@ END_EXTERN_C() #define ZEND_BIND_LEXICAL 182 #define ZEND_BIND_STATIC 183 #define ZEND_FETCH_THIS 184 +#define ZEND_ASSIGN_STATIC_PROP 185 #define ZEND_ISSET_ISEMPTY_THIS 186 #define ZEND_VM_LAST_OPCODE 186 diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index e59fbb4e17bf..3098c5a28a83 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -195,6 +195,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx LITERAL_CLASS_CONST, (ZEND_OP1_TYPE(opline) == IS_CONST) ? 1 : 2, 1, op_array); break; + case ZEND_ASSIGN_STATIC_PROP: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: @@ -203,6 +204,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: case ZEND_ISSET_ISEMPTY_STATIC_PROP: +handle_static_prop: if (ZEND_OP2_TYPE(opline) == IS_CONST) { LITERAL_INFO(opline->op2.constant, LITERAL_CLASS, 1, 1, 2); } @@ -264,6 +266,9 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_ASSIGN_BW_OR: case ZEND_ASSIGN_BW_AND: case ZEND_ASSIGN_BW_XOR: + if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + goto handle_static_prop; + } if (ZEND_OP2_TYPE(opline) == IS_CONST) { if (opline->extended_value == ZEND_ASSIGN_OBJ) { optimizer_literal_obj_info( diff --git a/ext/opcache/Optimizer/zend_dump.c b/ext/opcache/Optimizer/zend_dump.c index cd07309df80e..43d55634758d 100644 --- a/ext/opcache/Optimizer/zend_dump.c +++ b/ext/opcache/Optimizer/zend_dump.c @@ -422,6 +422,8 @@ static void zend_dump_op(const zend_op_array *op_array, const zend_basic_block * fprintf(stderr, " (dim)"); } else if (opline->extended_value == ZEND_ASSIGN_OBJ) { fprintf(stderr, " (obj)"); + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + fprintf(stderr, " (static prop)"); } } else if (ZEND_VM_EXT_CLASS_FETCH == (flags & ZEND_VM_EXT_MASK)) { zend_dump_class_fetch_type(opline->extended_value); diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index c88821e0e3e4..0e310eecd69b 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -181,6 +181,22 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, alloc_cache_slots_op1(op_array, opline, 1); zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); break; + case ZEND_ASSIGN_ADD: + case ZEND_ASSIGN_SUB: + case ZEND_ASSIGN_MUL: + case ZEND_ASSIGN_DIV: + case ZEND_ASSIGN_MOD: + case ZEND_ASSIGN_SL: + case ZEND_ASSIGN_SR: + case ZEND_ASSIGN_CONCAT: + case ZEND_ASSIGN_BW_OR: + case ZEND_ASSIGN_BW_AND: + case ZEND_ASSIGN_BW_XOR: + case ZEND_ASSIGN_POW: + if (opline->extended_value != ZEND_ASSIGN_STATIC_PROP) { + break; + } + case ZEND_ASSIGN_STATIC_PROP: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: @@ -237,6 +253,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, case ZEND_ADD_INTERFACE: case ZEND_ADD_TRAIT: case ZEND_INSTANCEOF: + case ZEND_ASSIGN_STATIC_PROP: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: @@ -245,6 +262,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: case ZEND_ISSET_ISEMPTY_STATIC_PROP: +handle_static_prop: REQUIRES_STRING(val); drop_leading_backslash(val); opline->op2.constant = zend_optimizer_add_literal(op_array, val); @@ -321,6 +339,8 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, TO_STRING_NOWARN(val); opline->op2.constant = zend_optimizer_add_literal(op_array, val); alloc_cache_slots_op2(op_array, opline, 2); + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + goto handle_static_prop; } else { opline->op2.constant = zend_optimizer_add_literal(op_array, val); } From 786d4bbc48906efbe8e9823c3dc709935f51df35 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 9 Dec 2016 13:33:07 +0300 Subject: [PATCH 218/369] Fixed optimizer support for ZEND_ASSIGN_OBJ_REF --- ext/opcache/Optimizer/compact_literals.c | 1 + ext/opcache/Optimizer/zend_optimizer.c | 1 + 2 files changed, 2 insertions(+) diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index c377a917d98f..b90e53b92ffe 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -230,6 +230,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx } break; case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: case ZEND_FETCH_OBJ_R: case ZEND_FETCH_OBJ_W: case ZEND_FETCH_OBJ_RW: diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 4939c2855db8..8eb7e99b6c63 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -294,6 +294,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, break; /*case ZEND_FETCH_CLASS_CONSTANT:*/ case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: case ZEND_FETCH_OBJ_R: case ZEND_FETCH_OBJ_W: case ZEND_FETCH_OBJ_RW: From a9b0cd7bd6bee30c0a2b9b65cab2d57286be2020 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 9 Dec 2016 17:02:23 +0300 Subject: [PATCH 219/369] Implemented type inference support for typed properties. --- ext/opcache/Optimizer/zend_inference.c | 95 ++++++++++++++++++++++---- 1 file changed, 82 insertions(+), 13 deletions(-) diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 42ec4078b1bf..4fbdee96c4a5 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -2017,11 +2017,11 @@ static int zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{ } /* }}} */ -#define UPDATE_SSA_TYPE(_type, _var) \ +#define UPDATE_SSA_TYPE_EX(_type, _var, _typed_ref) \ do { \ uint32_t __type = (_type); \ int __var = (_var); \ - if (__type & MAY_BE_REF) { \ + if (!(_typed_ref) && (__type & MAY_BE_REF)) { \ __type |= MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; \ } \ if (__var >= 0) { \ @@ -2044,6 +2044,10 @@ static int zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{ } \ } while (0) +#define UPDATE_SSA_TYPE(_type, _var) \ + UPDATE_SSA_TYPE_EX(_type, _var, 0) + + #define UPDATE_SSA_OBJ_TYPE(_ce, _is_instanceof, var) \ do { \ if (var >= 0) { \ @@ -2426,6 +2430,44 @@ static uint32_t zend_fetch_arg_info(const zend_script *script, zend_arg_info *ar return tmp; } +static uint32_t zend_fetch_prop_info(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, int i, zend_class_entry **pce) +{ + zend_property_info *prop_info = NULL; + + if (opline->op2_type == IS_CONST) { + zend_class_entry *ce = NULL; + + if (opline->op1_type == IS_UNUSED) { + ce = op_array->scope; + } else if (ssa->ops[i].op1_use >= 0) { + ce = ssa->var_info[ssa->ops[i].op1_use].ce; + } + if (ce) { + prop_info = zend_hash_find_ptr(&ce->properties_info, Z_STR_P(CRT_CONSTANT_EX(op_array, opline->op2, ssa->rt_constants))); + } + } + + if (prop_info && prop_info->type) { + uint32_t type = MAY_BE_UNDEF | MAY_BE_REF | (1 << prop_info->type); + + if (prop_info->allow_null) { + type |= MAY_BE_NULL; + } + if (type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + type |= MAY_BE_RC1 | MAY_BE_RCN; + } + if (pce) { + *pce = prop_info->type_ce; + } + return type; + } + + if (pce) { + *pce = NULL; + } + return 0; +} + static void zend_update_type_info(const zend_op_array *op_array, zend_ssa *ssa, const zend_script *script, @@ -2593,9 +2635,12 @@ static void zend_update_type_info(const zend_op_array *op_array, orig = 0; tmp = 0; if (opline->extended_value == ZEND_ASSIGN_OBJ) { - tmp |= MAY_BE_REF; orig = t1; - t1 = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; + t1 = zend_fetch_prop_info(op_array, ssa, opline, i, NULL); + if (!t1) { + tmp |= MAY_BE_REF; + t1 = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; + } t2 = OP1_DATA_INFO(); } else if (opline->extended_value == ZEND_ASSIGN_DIM) { if (t1 & MAY_BE_ARRAY_OF_REF) { @@ -2641,6 +2686,7 @@ static void zend_update_type_info(const zend_op_array *op_array, UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); } if (ssa_ops[i].result_def >= 0) { + ce = NULL; if (opline->extended_value == ZEND_ASSIGN_DIM) { if (opline->op2_type == IS_UNUSED) { /* When appending to an array and the LONG_MAX key is already used @@ -2662,8 +2708,16 @@ static void zend_update_type_info(const zend_op_array *op_array, * anything else results in a null return value. */ tmp |= MAY_BE_NULL; } + t1 = zend_fetch_prop_info(op_array, ssa, opline, i, &ce); + if (t1) { + tmp &= t1; + } } + tmp &= ~MAY_BE_REF; UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); + if (ce) { + UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); + } } break; case ZEND_PRE_INC: @@ -2841,8 +2895,15 @@ static void zend_update_type_info(const zend_op_array *op_array, } if (ssa_ops[i].result_def >= 0) { // TODO: ??? - tmp = MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; + tmp = MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; + t1 = zend_fetch_prop_info(op_array, ssa, opline, i, &ce); + if (t1) { + tmp &= t1; + } UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); + if (ce) { + UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); + } } if ((opline+1)->op1_type == IS_CV) { opline++; @@ -3415,16 +3476,24 @@ static void zend_update_type_info(const zend_op_array *op_array, COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); } if (ssa_ops[i].result_def >= 0) { - tmp = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; - if (opline->opcode != ZEND_FETCH_OBJ_R && opline->opcode != ZEND_FETCH_OBJ_IS) { - tmp |= MAY_BE_ERROR; - } - if (opline->result_type == IS_TMP_VAR) { - tmp |= MAY_BE_RC1 | MAY_BE_RCN; + tmp = zend_fetch_prop_info(op_array, ssa, opline, i, &ce); + if (tmp) { + UPDATE_SSA_TYPE_EX(tmp, ssa_ops[i].result_def, 1); + if (ce) { + UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); + } } else { - tmp |= MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN; + tmp = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; + if (opline->opcode != ZEND_FETCH_OBJ_R && opline->opcode != ZEND_FETCH_OBJ_IS) { + tmp |= MAY_BE_ERROR; + } + if (opline->result_type == IS_TMP_VAR) { + tmp |= MAY_BE_RC1 | MAY_BE_RCN; + } else { + tmp |= MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); } - UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); } break; case ZEND_DO_FCALL: From f56bd3948b170db6ae7f7d59faa7387656486f63 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 10 Jan 2017 13:00:54 +0300 Subject: [PATCH 220/369] Fixed tests (made them 32/64-bit independent) --- .../tests/type_declarations/typed_properties_033.phpt | 2 +- .../tests/type_declarations/typed_properties_061.phpt | 8 ++++---- .../tests/type_declarations/typed_properties_062.phpt | 11 ++++++----- .../tests/type_declarations/typed_properties_063.phpt | 11 ++++++----- .../tests/type_declarations/typed_properties_064.phpt | 11 ++++++----- .../tests/type_declarations/typed_properties_065.phpt | 8 ++++---- 6 files changed, 27 insertions(+), 24 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_033.phpt b/Zend/tests/type_declarations/typed_properties_033.phpt index d1f7302933f2..d40df54b1e37 100644 --- a/Zend/tests/type_declarations/typed_properties_033.phpt +++ b/Zend/tests/type_declarations/typed_properties_033.phpt @@ -34,5 +34,5 @@ object(class@anonymous)#1 (4) { ["baz"]=> int(6) ["qux"]=> - &int(9223372036854775807) + &int(%d) } diff --git a/Zend/tests/type_declarations/typed_properties_061.phpt b/Zend/tests/type_declarations/typed_properties_061.phpt index 144a759c317e..d3219d25b86e 100644 --- a/Zend/tests/type_declarations/typed_properties_061.phpt +++ b/Zend/tests/type_declarations/typed_properties_061.phpt @@ -37,12 +37,12 @@ $a->foo = PHP_INT_MAX; try { $a->_++; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; try { ++$a->_; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; ?> --EXPECT-- @@ -53,6 +53,6 @@ int(21) int(20) int(19) Cannot assign float to reference of type integer -int(9223372036854775807) +integer Cannot assign float to reference of type integer -int(9223372036854775807) +integer diff --git a/Zend/tests/type_declarations/typed_properties_062.phpt b/Zend/tests/type_declarations/typed_properties_062.phpt index bacbe35be106..95d22f4ae7c0 100644 --- a/Zend/tests/type_declarations/typed_properties_062.phpt +++ b/Zend/tests/type_declarations/typed_properties_062.phpt @@ -32,13 +32,14 @@ $a->foo = PHP_INT_MAX; try { $a->_++; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; try { ++$a->_; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; +$a->_ = 0; try { $a->_ = []; } catch (Error $e) { echo $e->getMessage(), "\n"; } @@ -56,9 +57,9 @@ int(21) int(20) int(19) Cannot assign float to reference of type integer -int(9223372036854775807) +integer Cannot assign float to reference of type integer -int(9223372036854775807) +integer Cannot assign array to reference of type integer -int(9223372036854775807) +int(0) int(1) diff --git a/Zend/tests/type_declarations/typed_properties_063.phpt b/Zend/tests/type_declarations/typed_properties_063.phpt index 8f9985662639..10e926e78eaf 100644 --- a/Zend/tests/type_declarations/typed_properties_063.phpt +++ b/Zend/tests/type_declarations/typed_properties_063.phpt @@ -31,13 +31,14 @@ $a->foo = PHP_INT_MAX; try { $_++; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; try { ++$_; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; +$_ = 0; try { $_ = []; } catch (Error $e) { echo $e->getMessage(), "\n"; } @@ -55,9 +56,9 @@ int(21) int(20) int(19) Cannot assign float to reference of type integer -int(9223372036854775807) +integer Cannot assign float to reference of type integer -int(9223372036854775807) +integer Cannot assign array to reference of type integer -int(9223372036854775807) +int(0) int(1) diff --git a/Zend/tests/type_declarations/typed_properties_064.phpt b/Zend/tests/type_declarations/typed_properties_064.phpt index 241125ffb1ea..40df2e0392d2 100644 --- a/Zend/tests/type_declarations/typed_properties_064.phpt +++ b/Zend/tests/type_declarations/typed_properties_064.phpt @@ -31,13 +31,14 @@ $a->foo = PHP_INT_MAX; try { $_[0]++; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; try { ++$_[0]; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; +$_[0] = 0; try { $_[0] = []; } catch (Error $e) { echo $e->getMessage(), "\n"; } @@ -55,9 +56,9 @@ int(21) int(20) int(19) Cannot assign float to reference of type integer -int(9223372036854775807) +integer Cannot assign float to reference of type integer -int(9223372036854775807) +integer Cannot assign array to reference of type integer -int(9223372036854775807) +int(0) int(1) diff --git a/Zend/tests/type_declarations/typed_properties_065.phpt b/Zend/tests/type_declarations/typed_properties_065.phpt index e19852ba1ee3..4c0285ee8a36 100644 --- a/Zend/tests/type_declarations/typed_properties_065.phpt +++ b/Zend/tests/type_declarations/typed_properties_065.phpt @@ -34,12 +34,12 @@ $a->foo = PHP_INT_MAX; try { $a[0]++; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; try { ++$a[0]; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; ?> --EXPECT-- @@ -50,6 +50,6 @@ int(21) int(20) int(19) Cannot assign float to reference of type integer -int(9223372036854775807) +integer Cannot assign float to reference of type integer -int(9223372036854775807) +integer From 354c1aff6e82fca860e90836299b310f7b8718ad Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 11 Jan 2017 13:03:37 +0100 Subject: [PATCH 221/369] Fix a bunch of bugs related to e8109e09 --- .../typed_properties_044.phpt | 2 ++ Zend/zend_execute.c | 19 ++++++++----- Zend/zend_vm_def.h | 3 ++- Zend/zend_vm_execute.h | 27 ++++++++++++------- 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt index a0eec85b5160..490c6ff85913 100644 --- a/Zend/tests/type_declarations/typed_properties_044.phpt +++ b/Zend/tests/type_declarations/typed_properties_044.phpt @@ -1,5 +1,7 @@ --TEST-- Test increment functions on typed property references +--SKIPIF-- + --FILE-- write_property(&obj, property, z, cache_slot); - zval_ptr_dtor(z); } zval_ptr_dtor(z); OBJ_RELEASE(Z_OBJ(obj)); @@ -1636,16 +1635,19 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, decrement_function(tmp); } } + if (UNEXPECTED(result)) { + ZVAL_COPY(result, tmp); + } } else { if (inc) { increment_function(z); } else { decrement_function(z); } - Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); - if (UNEXPECTED(result) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(result)) { ZVAL_COPY(result, z); } + Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); } OBJ_RELEASE(Z_OBJ(obj)); zval_ptr_dtor(zptr); @@ -1710,6 +1712,10 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z SEPARATE_ZVAL_NOREF(tmp); binary_op(tmp, tmp, value); } + + if (UNEXPECTED(result)) { + ZVAL_COPY(result, tmp); + } } else { if (UNEXPECTED(prop_info)) { binary_op(&z_copy, z, value); @@ -1721,11 +1727,12 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z binary_op(z, z, value); Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); } - } - if (UNEXPECTED(result) && EXPECTED(!EG(exception))) { - ZVAL_COPY(result, z); + if (UNEXPECTED(result)) { + ZVAL_COPY(result, z); + } } + zval_ptr_dtor(z); } else { zend_error(E_WARNING, "Attempt to assign property of non-object"); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index ec3714da2a60..c3876d4246eb 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1225,7 +1225,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -1349,6 +1349,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 076218ad4bab..df03212c892a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18289,7 +18289,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -18412,6 +18412,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); @@ -23057,7 +23058,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -23180,6 +23181,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); @@ -26099,7 +26101,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -26223,6 +26225,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); @@ -28753,7 +28756,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -28876,6 +28879,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); @@ -31788,7 +31792,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -31911,6 +31915,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); @@ -34021,7 +34026,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -34145,6 +34150,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); @@ -39087,7 +39093,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -39210,6 +39216,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); @@ -46150,7 +46157,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -46273,6 +46280,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); @@ -50323,7 +50331,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -50447,6 +50455,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); From e20a1a314646bee89d89e54e698c8edb4fbbb8e4 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 15 Jan 2017 04:01:50 +0100 Subject: [PATCH 222/369] Fix crash in pcntl_wait() --- ext/pcntl/pcntl.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index 1f0de090df34..8170daaf8f00 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -711,12 +711,8 @@ PHP_FUNCTION(pcntl_wait) status = zval_get_long(z_status); #ifdef HAVE_WAIT3 if (z_rusage) { - if (Z_TYPE_P(z_rusage) != IS_ARRAY) { - zval_dtor(z_rusage); - array_init(z_rusage); - } else { - zend_hash_clean(Z_ARRVAL_P(z_rusage)); - } + zval_dtor(z_rusage); + array_init(z_rusage); memset(&rusage, 0, sizeof(struct rusage)); child_id = wait3(&status, options, &rusage); From 629521e8b9e9513d0bd2de293a3fef7b51ae9ed2 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 16 Jan 2017 14:34:04 +0100 Subject: [PATCH 223/369] Fix constant value overwrite --- .../typed_properties_066.phpt | 21 +++++++++++++++++++ Zend/zend_execute.h | 5 +++++ Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 18 ++++++++-------- 4 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_066.phpt 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 000000000000..a91a00df6500 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_066.phpt @@ -0,0 +1,21 @@ +--TEST-- +Typed property assignment must not overwrite constants +--FILE-- +x; +$y = 4; +var_dump($x, 4); /* Optimizer will merge both "4" constants, making it immediately visible */ + +?> +--EXPECT-- +object(Foo)#1 (1) { + ["x"]=> + &float(4) +} +int(4) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 6124f69e5873..fcf9b640848c 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -83,6 +83,7 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error(zend_type type, zval *zv); static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type, zend_bool strict) { zend_refcounted *ref = NULL; + zval tmp; if (ZEND_CONST_COND(value_type & (IS_VAR|IS_CV), 1) && Z_ISREF_P(value)) { ref = Z_COUNTED_P(value); @@ -94,6 +95,10 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval zend_refcounted *garbage; if (Z_ISREF_P(variable_ptr)) { + if (ZEND_CONST_COND(value_type == IS_CONST, 1)) { + ZVAL_COPY_VALUE(&tmp, value); + value = &tmp; + } if (!zend_verify_ref_type_assignable_zval(Z_REFTYPE_P(variable_ptr), value, strict)) { zend_throw_ref_type_error(Z_REFTYPE_P(variable_ptr), value); return Z_REFVAL_P(variable_ptr); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index afceb3038c3b..25601e6c361d 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -853,7 +853,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index af191fcb63ea..997705cb4da7 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17765,7 +17765,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -22534,7 +22534,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -25575,7 +25575,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -28555,7 +28555,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -31591,7 +31591,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -33825,7 +33825,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -38569,7 +38569,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -45633,7 +45633,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -49805,7 +49805,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } From 78dae201e48d574bafcea80fc9f2e6c437114b7b Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 16 Jan 2017 16:31:45 +0100 Subject: [PATCH 224/369] Add support for iterable typed properties --- .../type_declarations/typed_properties_001.phpt | 9 ++++++++- Zend/zend_API.h | 2 +- Zend/zend_execute.c | 13 +++++++++---- Zend/zend_execute.h | 3 ++- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_001.phpt b/Zend/tests/type_declarations/typed_properties_001.phpt index 5a346a4c3e80..575a144e47d5 100644 --- a/Zend/tests/type_declarations/typed_properties_001.phpt +++ b/Zend/tests/type_declarations/typed_properties_001.phpt @@ -8,6 +8,7 @@ var_dump(new class(1, 2.2, true, ["four"], new stdClass) { 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; @@ -15,11 +16,12 @@ var_dump(new class(1, 2.2, true, ["four"], new stdClass) { $this->bool = $bool; $this->array = $array; $this->std = $std; + $this->it = $array; } }); ?> --EXPECTF-- -object(class@anonymous)#%d (5) { +object(class@anonymous)#%d (6) { ["int"]=> int(1) ["float"]=> @@ -34,5 +36,10 @@ object(class@anonymous)#%d (5) { ["std"]=> object(stdClass)#%d (0) { } + ["it"]=> + array(1) { + [0]=> + string(4) "four" + } } diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 7b2376864291..ffed869b4a2f 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -1052,7 +1052,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(zend_bool throw_ /* old "t" */ #define Z_PARAM_ARRAY_ASSIGNABLE_EX(dest, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (Z_ISREF_P(_real_arg) && Z_REFTYPE_P(_real_arg) && (((uintptr_t) Z_REFTYPE_P(_real_arg)) >> 1) != IS_ARRAY) { \ + if (Z_ISREF_P(_real_arg) && Z_REFTYPE_P(_real_arg) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(_real_arg), IS_ARRAY)) { \ _expected_type = Z_EXPECTED_ARRAY; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index e490b100494a..791be5dafbe0 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -882,6 +882,8 @@ static zend_always_inline zval* i_zend_verify_property_type(zend_property_info * } } else if (ZEND_TYPE_CODE(info->type) == _IS_BOOL && EXPECTED(Z_TYPE_P(property) == IS_FALSE || Z_TYPE_P(property) == IS_TRUE)) { return property; + } else if (ZEND_TYPE_CODE(info->type) == IS_ITERABLE) { + return zend_is_iterable(property) ? property : NULL; } else { return zend_verify_scalar_type_hint(ZEND_TYPE_CODE(info->type), property, tmp, strict) ? tmp : NULL; @@ -901,18 +903,21 @@ static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(zend_ } ZVAL_DEREF(zv); - if (Z_TYPE_P(zv) == IS_OBJECT) { - return ZEND_TYPE_IS_CLASS(type) && instanceof_function(Z_OBJCE_P(zv), ZEND_TYPE_CE(type)); - } - if (zend_verify_ref_type_assignable(type, Z_TYPE_P(zv))) { return 1; } + if (ZEND_TYPE_IS_CLASS(type)) { + return Z_TYPE_P(zv) == IS_OBJECT && instanceof_function(Z_OBJCE_P(zv), ZEND_TYPE_CE(type)); + } + cur_type = ZEND_TYPE_CODE(type); if (cur_type == IS_CALLABLE) { return zend_is_callable(zv, IS_CALLABLE_CHECK_SILENT, NULL); } + if (cur_type == IS_ITERABLE) { + return zend_is_iterable(zv); + } return zend_verify_scalar_type_hint(cur_type, zv, zv, strict); } diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index fcf9b640848c..63214ee43410 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -74,7 +74,8 @@ static zend_always_inline zend_bool zend_verify_ref_type_assignable(zend_type ty zend_uchar cur_type = ZEND_TYPE_CODE(type); return new_type == cur_type || (ZEND_TYPE_ALLOW_NULL(type) && new_type == IS_NULL) - || (new_type == _IS_BOOL && (cur_type == IS_FALSE || cur_type == IS_TRUE)); + || (cur_type == _IS_BOOL && (new_type == IS_FALSE || new_type == IS_TRUE)) + || (cur_type == IS_ITERABLE && new_type == IS_ARRAY); } ZEND_API zend_bool zend_verify_ref_type_assignable_zval(zend_type type, zval *zv, zend_bool strict); From 965f2c80aa5c868208bd5f96ed80946d24eb4d44 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 7 Jun 2018 00:49:21 +0200 Subject: [PATCH 225/369] Fix build failures --- Zend/zend_API.h | 2 +- Zend/zend_compile.c | 12 +- Zend/zend_execute.c | 9 +- Zend/zend_language_scanner.c | 9750 ++++++++++++------------ Zend/zend_language_scanner_defs.h | 2 +- Zend/zend_vm_def.h | 6 +- Zend/zend_vm_execute.h | 130 +- Zend/zend_vm_gen.php | 4 +- ext/opcache/Optimizer/zend_inference.c | 2 +- ext/standard/file.c | 9 - ext/standard/var_unserializer.c | 932 +-- 11 files changed, 5095 insertions(+), 5763 deletions(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index b8124b5ce69e..cdc632798022 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -1135,7 +1135,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha /* old "t" */ #define Z_PARAM_ARRAY_ASSIGNABLE_EX(dest, check_null, separate) \ - Z_PARAM_PROLOGUE(separate); \ + Z_PARAM_PROLOGUE(1, separate); \ if (Z_ISREF_P(_real_arg) && Z_REFTYPE_P(_real_arg) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(_real_arg), IS_ARRAY)) { \ _expected_type = Z_EXPECTED_ARRAY; \ error_code = ZPP_ERROR_WRONG_ARG; \ diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 9eef526a726d..3ae0bc0aa502 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2707,7 +2707,7 @@ 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, 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) { /* TODO(typed_props) extended_value is now used for the cache slot */ opline->extended_value |= ZEND_FETCH_REF; @@ -3020,7 +3020,7 @@ void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */ "Cannot assign reference to non referencable value"); } - zend_compile_var(&expr_node, expr_ast, BP_VAR_W); + zend_compile_var(&expr_node, expr_ast, BP_VAR_W, 1); /* MAKE_REF is usually not necessary for CVs. However, if there are * self-assignments, this forces the RHS to evaluate first. */ if (expr_node.op_type != IS_CV @@ -4341,7 +4341,7 @@ 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: @@ -7312,7 +7312,7 @@ void zend_compile_post_incdec(znode *result, zend_ast *ast) /* {{{ */ zend_ensure_writable_variable(var_ast); if (var_ast->kind == ZEND_AST_PROP) { - zend_op *opline = zend_compile_prop(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 { @@ -7332,7 +7332,7 @@ void zend_compile_pre_incdec(znode *result, zend_ast *ast) /* {{{ */ zend_ensure_writable_variable(var_ast); if (var_ast->kind == ZEND_AST_PROP) { - zend_op *opline = zend_compile_prop(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 { znode var_node; @@ -7615,7 +7615,7 @@ 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: diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 1d75708914b2..75cd475319f0 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -641,7 +641,7 @@ static zend_never_inline ZEND_COLD int zend_wrong_assign_to_variable_reference(z return 0; } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, value_type); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, value_type, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); @@ -1636,10 +1636,10 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, * a dereferenced value and then written back. The type check in write_property should * thus be sufficient. */ if (UNEXPECTED(Z_ISREF_P(z))) { + zend_property_info *prop_info; zend_type ref_type = Z_REFTYPE_P(z); tmp = Z_REFVAL_P(z); - ZVAL_COPY(result, tmp); - zend_property_info *prop_info; + ZVAL_COPY(EX_VAR(opline->result.var), tmp); if (inc) { increment_function(tmp); @@ -1656,10 +1656,9 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, zend_verify_property_type_error(prop_info, Z_STR_P(property), tmp); } zval_ptr_dtor(tmp); - ZVAL_COPY_VALUE(tmp, result); + ZVAL_COPY_VALUE(tmp, EX_VAR(opline->result.var)); } } - ZVAL_COPY(EX_VAR(opline->result.var), Z_REFVAL_P(z)); } else { ZVAL_COPY(EX_VAR(opline->result.var), z); ZVAL_COPY(&z_copy, EX_VAR(opline->result.var)); diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c index 65995f0f35a2..49f4247ae579 100644 --- a/Zend/zend_language_scanner.c +++ b/Zend/zend_language_scanner.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.16 */ +/* Generated by re2c 1.0.1 */ #line 1 "Zend/zend_language_scanner.l" /* +----------------------------------------------------------------------+ @@ -75,6 +75,7 @@ /* perform sanity check. If this message is triggered you should increase the ZEND_MMAP_AHEAD value in the zend_streams.h file */ #define YYMAXFILL 16 + #if ZEND_MMAP_AHEAD < YYMAXFILL # error ZEND_MMAP_AHEAD should be greater than or equal to YYMAXFILL #endif @@ -1225,7 +1226,7 @@ int start_line = CG(zend_lineno); SCNG(yy_text) = YYCURSOR; -#line 1229 "Zend/zend_language_scanner.c" +#line 1230 "Zend/zend_language_scanner.c" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -1267,820 +1268,1054 @@ int start_line = CG(zend_lineno); } } /* *********************************** */ -yyc_INITIAL: - YYDEBUG(1, *YYCURSOR); - YYFILL(7); - yych = *YYCURSOR; - if (yych == '<') goto yy5; - YYDEBUG(3, *YYCURSOR); - ++YYCURSOR; -yy4: - YYDEBUG(4, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1938 "Zend/zend_language_scanner.l" +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 2720 "Zend/zend_language_scanner.l" + { if (YYCURSOR > YYLIMIT) { RETURN_TOKEN(END); } -inline_char_handler: + zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); + goto restart; +} +#line 1447 "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 1409 "Zend/zend_language_scanner.l" + { + goto return_whitespace; +} +#line 1463 "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 1692 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(yytext[0]); +} +#line 1475 "Zend/zend_language_scanner.c" +yy10: + YYDEBUG(10, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(11, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 2203 "Zend/zend_language_scanner.l" + { + int bprefix = (yytext[0] != '"') ? 1 : 0; - while (1) { - YYCTYPE *ptr = memchr(YYCURSOR, '<', YYLIMIT - YYCURSOR); + 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 = ptr ? ptr + 1 : YYLIMIT; + YYCURSOR--; + break; + } - if (YYCURSOR >= YYLIMIT) { - break; - } + /* Remember how much was scanned to save rescanning */ + SET_DOUBLE_QUOTES_SCANNED_LENGTH(YYCURSOR - SCNG(yy_text) - yyleng); - if (*YYCURSOR == '?') { - if (CG(short_tags) || !strncasecmp((char*)YYCURSOR + 1, "php", 3) || (*(YYCURSOR + 1) == '=')) { /* Assume [ \t\n\r] follows "php" */ + YYCURSOR = SCNG(yy_text) + yyleng; - YYCURSOR--; + BEGIN(ST_DOUBLE_QUOTES); + RETURN_TOKEN('"'); +} +#line 1526 "Zend/zend_language_scanner.c" +yy12: + YYDEBUG(12, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(13, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 2030 "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 (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); + if (EXPECTED(elem != NULL)) { + SKIP_TOKEN(T_COMMENT); } - HANDLE_NEWLINES(yytext, yyleng); - RETURN_TOKEN_WITH_VAL(T_INLINE_HTML); + RETURN_TOKEN(T_COMMENT); } -#line 1328 "Zend/zend_language_scanner.c" -yy5: - YYDEBUG(5, *YYCURSOR); - yych = *++YYCURSOR; - if (yych != '?') goto yy4; - YYDEBUG(6, *YYCURSOR); - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 'O') { - if (yych == '=') goto yy8; - } else { - if (yych <= 'P') goto yy10; - if (yych == 'p') goto yy10; - } -yy7: - YYDEBUG(7, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1926 "Zend/zend_language_scanner.l" - { - if (CG(short_tags)) { - BEGIN(ST_IN_SCRIPTING); - if (EXPECTED(elem != NULL)) { - SKIP_TOKEN(T_OPEN_TAG); - } - RETURN_TOKEN(T_OPEN_TAG); - } else { - goto inline_char_handler; - } -} -#line 1356 "Zend/zend_language_scanner.c" -yy8: - YYDEBUG(8, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(9, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1907 "Zend/zend_language_scanner.l" - { - BEGIN(ST_IN_SCRIPTING); - if (PARSER_MODE()) { - RETURN_TOKEN(T_ECHO); - } - RETURN_TOKEN(T_OPEN_TAG_WITH_ECHO); -} -#line 1370 "Zend/zend_language_scanner.c" -yy10: - YYDEBUG(10, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'H') goto yy12; - if (yych == 'h') goto yy12; -yy11: - YYDEBUG(11, *YYCURSOR); - YYCURSOR = YYMARKER; - goto yy7; -yy12: - YYDEBUG(12, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'P') goto yy13; - if (yych != 'p') goto yy11; -yy13: - YYDEBUG(13, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '\f') { - if (yych <= 0x08) goto yy11; - if (yych >= '\v') goto yy11; - } else { - if (yych <= '\r') goto yy16; - if (yych != ' ') goto yy11; - } +#line 1564 "Zend/zend_language_scanner.c" yy14: - YYDEBUG(14, *YYCURSOR); - ++YYCURSOR; -yy15: - YYDEBUG(15, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1916 "Zend/zend_language_scanner.l" - { - HANDLE_NEWLINE(yytext[yyleng-1]); - BEGIN(ST_IN_SCRIPTING); - if (EXPECTED(elem != NULL)) { - SKIP_TOKEN(T_OPEN_TAG); - } - RETURN_TOKEN(T_OPEN_TAG); -} -#line 1410 "Zend/zend_language_scanner.c" -yy16: - YYDEBUG(16, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == '\n') goto yy14; - goto yy15; -/* *********************************** */ -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(17, *YYCURSOR); - YYFILL(2); - yych = *YYCURSOR; + YYDEBUG(14, *YYCURSOR); + yych = *++YYCURSOR; if (yych <= '_') { - if (yych == '$') goto yy21; + if (yych <= '@') goto yy9; + if (yych <= 'Z') goto yy71; + if (yych <= '^') goto yy9; + goto yy71; } else { - if (yych <= '`') goto yy22; - if (yych == '{') goto yy24; + if (yych <= '`') goto yy9; + if (yych <= 'z') goto yy71; + if (yych <= 0x7F) goto yy9; + goto yy71; } - YYDEBUG(19, *YYCURSOR); +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; -yy20: - YYDEBUG(20, *YYCURSOR); + YYDEBUG(18, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2472 "Zend/zend_language_scanner.l" +#line 2113 "Zend/zend_language_scanner.l" { - if (YYCURSOR > YYLIMIT) { - RETURN_TOKEN(END); - } - if (yytext[0] == '\\' && YYCURSOR < YYLIMIT) { - YYCURSOR++; - } + 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); - 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; + } 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); } + } - YYCURSOR--; - break; + 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); - yyleng = YYCURSOR - SCNG(yy_text); + /* 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; + } + } - 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); + t = s; + while (s') goto yy36; + if (yych <= '<') goto yy9; + if (yych <= '=') goto yy126; + if (yych <= '>') goto yy128; + goto yy9; yy33: YYDEBUG(33, *YYCURSOR); - YYCURSOR = YYMARKER; - goto yy27; + yych = *++YYCURSOR; + if (yych <= '<') goto yy9; + if (yych <= '=') goto yy130; + if (yych <= '>') goto yy132; + goto yy9; yy34: YYDEBUG(34, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych <= '=') goto yy9; + if (yych <= '>') goto yy134; + if (yych <= '?') goto yy136; + goto yy9; +yy35: YYDEBUG(35, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1997 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 1); - yy_push_state(ST_VAR_OFFSET); - RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); -} -#line 1609 "Zend/zend_language_scanner.c" -yy36: - YYDEBUG(36, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '_') { - if (yych <= '@') goto yy33; - if (yych <= 'Z') goto yy37; - if (yych <= '^') goto yy33; + 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 <= '`') goto yy33; - if (yych <= 'z') goto yy37; - if (yych <= 0x7F) goto yy33; + 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; + } } -yy37: - YYDEBUG(37, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(38, *YYCURSOR); +yy36: + YYDEBUG(36, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1989 "Zend/zend_language_scanner.l" +#line 2025 "Zend/zend_language_scanner.l" { - yyless(yyleng - 3); - yy_push_state(ST_LOOKING_FOR_PROPERTY); - RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); + RETURN_TOKEN_WITH_STR(T_STRING, 0); } -#line 1633 "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(39, *YYCURSOR); - YYFILL(2); - yych = *YYCURSOR; - if (yych <= '#') { - if (yych == '"') goto yy43; +#line 1945 "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 <= '$') goto yy45; - if (yych == '{') goto yy46; - } - YYDEBUG(41, *YYCURSOR); - ++YYCURSOR; -yy42: - YYDEBUG(42, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2418 "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; + if (yych <= 'R') { + if (yych <= '<') goto yy143; + if (yych <= 'Q') goto yy44; + goto yy144; + } else { + if (yych == 'r') goto yy144; + goto yy44; + } } - - 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 1739 "Zend/zend_language_scanner.c" -yy43: - YYDEBUG(43, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(44, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2407 "Zend/zend_language_scanner.l" - { - BEGIN(ST_IN_SCRIPTING); - RETURN_TOKEN('"'); -} -#line 1750 "Zend/zend_language_scanner.c" -yy45: - YYDEBUG(45, *YYCURSOR); +yy38: + YYDEBUG(38, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '_') { - if (yych <= '@') goto yy42; - if (yych <= 'Z') goto yy47; - if (yych <= '^') goto yy42; - goto yy47; + 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 <= 'z') { - if (yych <= '`') goto yy42; - goto yy47; + if (yych <= 'k') { + if (yych == 'a') goto yy145; + goto yy44; } else { - if (yych <= '{') goto yy50; - if (yych <= 0x7F) goto yy42; - goto yy47; + if (yych <= 'l') goto yy146; + if (yych == 'o') goto yy147; + goto yy44; } } -yy46: - YYDEBUG(46, *YYCURSOR); +yy39: + YYDEBUG(39, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '$') goto yy52; - goto yy42; -yy47: - YYDEBUG(47, *YYCURSOR); - YYMARKER = ++YYCURSOR; - YYFILL(3); + 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; - YYDEBUG(48, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy47; +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; + } } - if (yych == '-') goto yy54; - if (yych <= '@') goto yy49; - if (yych <= '[') goto yy56; +yy48: + YYDEBUG(48, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'R') goto yy171; + if (yych == 'r') goto yy171; + goto yy44; yy49: YYDEBUG(49, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2003 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); -} -#line 1793 "Zend/zend_language_scanner.c" + 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); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'E') goto yy175; + if (yych == 'e') goto yy175; + goto yy44; +yy51: YYDEBUG(51, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1703 "Zend/zend_language_scanner.l" - { - yy_push_state(ST_LOOKING_FOR_VARNAME); - RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES); -} -#line 1804 "Zend/zend_language_scanner.c" + 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); - ++YYCURSOR; - YYDEBUG(53, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2400 "Zend/zend_language_scanner.l" - { - yy_push_state(ST_IN_SCRIPTING); - yyless(1); - RETURN_TOKEN(T_CURLY_OPEN); -} -#line 1816 "Zend/zend_language_scanner.c" -yy54: - YYDEBUG(54, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '>') goto yy58; -yy55: - YYDEBUG(55, *YYCURSOR); - YYCURSOR = YYMARKER; - goto yy49; -yy56: - YYDEBUG(56, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(57, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1997 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 1); - yy_push_state(ST_VAR_OFFSET); - RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); -} -#line 1836 "Zend/zend_language_scanner.c" -yy58: - YYDEBUG(58, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '_') { - if (yych <= '@') goto yy55; - if (yych <= 'Z') goto yy59; - if (yych <= '^') goto yy55; + if (yych <= 'R') { + if (yych == 'H') goto yy178; + if (yych <= 'Q') goto yy44; + goto yy179; } else { - if (yych <= '`') goto yy55; - if (yych <= 'z') goto yy59; - if (yych <= 0x7F) goto yy55; - } -yy59: - YYDEBUG(59, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(60, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1989 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 3); - yy_push_state(ST_LOOKING_FOR_PROPERTY); - RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); -} -#line 1860 "Zend/zend_language_scanner.c" - } -/* *********************************** */ -yyc_ST_END_HEREDOC: - YYDEBUG(61, *YYCURSOR); - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(63, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(64, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2386 "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 1884 "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(65, *YYCURSOR); - YYFILL(2); - yych = *YYCURSOR; - if (yych == '$') goto yy69; - if (yych == '{') goto yy70; - YYDEBUG(67, *YYCURSOR); - ++YYCURSOR; -yy68: - YYDEBUG(68, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2518 "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_START(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); - } - - /* 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); - - if (!SCNG(heredoc_scan_ahead) && !EG(exception) && PARSER_MODE()) { - zend_string *copy = Z_STR_P(zendlval); - - if (!strip_multiline_string_indentation(zendlval, newline, heredoc_label->indentation, heredoc_label->indentation_uses_spaces)) { - RETURN_TOKEN(T_ERROR); + if (yych <= 'h') { + if (yych <= 'g') goto yy44; + goto yy178; + } else { + if (yych == 'r') goto yy179; + goto yy44; + } } - - if (UNEXPECTED(zend_scan_escape_string(zendlval, ZSTR_VAL(copy), ZSTR_LEN(copy), 0) != SUCCESS)) { - zend_string_efree(copy); - RETURN_TOKEN(T_ERROR); +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; + } } - - zend_string_efree(copy); - } else { - HANDLE_NEWLINES(yytext, yyleng - newline); +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 1432 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_NS_SEPARATOR); +} +#line 2234 "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 2380 "Zend/zend_language_scanner.l" + { + BEGIN(ST_BACKQUOTE); + RETURN_TOKEN('`'); +} +#line 2255 "Zend/zend_language_scanner.c" +yy64: + YYDEBUG(64, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(65, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1697 "Zend/zend_language_scanner.l" + { + yy_push_state(ST_IN_SCRIPTING); + RETURN_TOKEN('{'); +} +#line 2266 "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 1709 "Zend/zend_language_scanner.l" + { + RESET_DOC_COMMENT(); + if (!zend_stack_is_empty(&SCNG(state_stack))) { + yy_pop_state(); } - - RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); + RETURN_TOKEN('}'); } -#line 2049 "Zend/zend_language_scanner.c" +#line 2286 "Zend/zend_language_scanner.c" yy69: YYDEBUG(69, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '_') { - if (yych <= '@') goto yy68; - if (yych <= 'Z') goto yy71; - if (yych <= '^') goto yy68; - goto yy71; - } else { - if (yych <= 'z') { - if (yych <= '`') goto yy68; - goto yy71; - } else { - if (yych <= '{') goto yy74; - if (yych <= 0x7F) goto yy68; - goto yy71; - } - } + if (yych == '=') goto yy193; yy70: YYDEBUG(70, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '$') goto yy76; - goto yy68; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1596 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_IS_NOT_EQUAL); +} +#line 2298 "Zend/zend_language_scanner.c" yy71: YYDEBUG(71, *YYCURSOR); - YYMARKER = ++YYCURSOR; - YYFILL(3); + ++YYCURSOR; + YYFILL(1); yych = *YYCURSOR; YYDEBUG(72, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy71; + 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; + } } - if (yych == '-') goto yy78; - if (yych <= '@') goto yy73; - if (yych <= '[') goto yy80; yy73: YYDEBUG(73, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); @@ -2088,5400 +2323,4836 @@ int start_line = CG(zend_lineno); { RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 2092 "Zend/zend_language_scanner.c" +#line 2327 "Zend/zend_language_scanner.c" yy74: YYDEBUG(74, *YYCURSOR); ++YYCURSOR; YYDEBUG(75, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1703 "Zend/zend_language_scanner.l" +#line 1640 "Zend/zend_language_scanner.l" { - yy_push_state(ST_LOOKING_FOR_VARNAME); - RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES); + RETURN_TOKEN(T_MOD_EQUAL); } -#line 2103 "Zend/zend_language_scanner.c" +#line 2337 "Zend/zend_language_scanner.c" yy76: YYDEBUG(76, *YYCURSOR); ++YYCURSOR; YYDEBUG(77, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2400 "Zend/zend_language_scanner.l" +#line 1668 "Zend/zend_language_scanner.l" { - yy_push_state(ST_IN_SCRIPTING); - yyless(1); - RETURN_TOKEN(T_CURLY_OPEN); + RETURN_TOKEN(T_BOOLEAN_AND); } -#line 2115 "Zend/zend_language_scanner.c" +#line 2347 "Zend/zend_language_scanner.c" yy78: YYDEBUG(78, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '>') goto yy82; -yy79: - YYDEBUG(79, *YYCURSOR); - YYCURSOR = YYMARKER; - goto yy73; -yy80: - YYDEBUG(80, *YYCURSOR); ++YYCURSOR; - YYDEBUG(81, *YYCURSOR); + YYDEBUG(79, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1997 "Zend/zend_language_scanner.l" +#line 1652 "Zend/zend_language_scanner.l" { - yyless(yyleng - 1); - yy_push_state(ST_VAR_OFFSET); - RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); + RETURN_TOKEN(T_AND_EQUAL); } -#line 2135 "Zend/zend_language_scanner.c" -yy82: - YYDEBUG(82, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '_') { - if (yych <= '@') goto yy79; - if (yych <= 'Z') goto yy83; - if (yych <= '^') goto yy79; - } else { - if (yych <= '`') goto yy79; - if (yych <= 'z') goto yy83; - if (yych <= 0x7F) goto yy79; - } -yy83: - YYDEBUG(83, *YYCURSOR); +#line 2357 "Zend/zend_language_scanner.c" +yy80: + YYDEBUG(80, *YYCURSOR); ++YYCURSOR; - YYDEBUG(84, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1989 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 3); - yy_push_state(ST_LOOKING_FOR_PROPERTY); - RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); -} -#line 2159 "Zend/zend_language_scanner.c" - } -/* *********************************** */ -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(85, *YYCURSOR); - YYFILL(16); + YYFILL(7); yych = *YYCURSOR; - if (yybm[0+yych] & 4) { - goto yy89; +yy81: + YYDEBUG(81, *YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy80; } 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 yy87; - case ' ': - case '!': goto yy92; - case '"': goto yy94; - case '#': goto yy96; - case '$': goto yy98; - case '%': goto yy99; - case '&': goto yy100; - case '\'': goto yy101; - case '(': goto yy103; - case ')': - case ',': - case ';': - case '@': - case '[': - case ']': - case '~': goto yy104; - case '*': goto yy105; - case '+': goto yy106; - case '-': goto yy107; - case '.': goto yy108; - case '/': goto yy109; - case '0': goto yy110; - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': goto yy112; - case ':': goto yy114; - case '<': goto yy115; - case '=': goto yy116; - case '>': goto yy117; - case '?': goto yy118; case 'A': - case 'a': goto yy119; + case 'a': goto yy83; case 'B': - case 'b': goto yy121; - case 'C': - case 'c': goto yy122; + case 'b': goto yy84; case 'D': - case 'd': goto yy123; - case 'E': - case 'e': goto yy124; + case 'd': goto yy85; case 'F': - case 'f': goto yy125; - case 'G': - case 'g': goto yy126; + case 'f': goto yy86; case 'I': - case 'i': goto yy129; - case 'L': - case 'l': goto yy130; - case 'N': - case 'n': goto yy131; + case 'i': goto yy87; case 'O': - case 'o': goto yy132; - case 'P': - case 'p': goto yy133; + case 'o': goto yy88; case 'R': - case 'r': goto yy134; + case 'r': goto yy89; case 'S': - case 's': goto yy135; - case 'T': - case 't': goto yy136; + case 's': goto yy90; case 'U': - case 'u': goto yy137; - case 'V': - case 'v': goto yy138; - case 'W': - case 'w': goto yy139; - case 'X': - case 'x': goto yy140; - case 'Y': - case 'y': goto yy141; - case '\\': goto yy142; - case '^': goto yy144; - case '_': goto yy145; - case '`': goto yy146; - case '{': goto yy148; - case '|': goto yy150; - case '}': goto yy151; - default: goto yy127; + 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); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'N') goto yy200; + if (yych == 'n') goto yy200; + goto yy82; +yy88: YYDEBUG(88, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2720 "Zend/zend_language_scanner.l" - { - if (YYCURSOR > YYLIMIT) { - RETURN_TOKEN(END); - } - - zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); - goto restart; -} -#line 2337 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'B') goto yy201; + if (yych == 'b') goto yy201; + goto yy82; yy89: YYDEBUG(89, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'E') goto yy202; + if (yych == 'e') goto yy202; + goto yy82; +yy90: YYDEBUG(90, *YYCURSOR); - if (yybm[0+yych] & 4) { - goto yy89; - } + yych = *++YYCURSOR; + if (yych == 'T') goto yy203; + if (yych == 't') goto yy203; + goto yy82; +yy91: YYDEBUG(91, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1409 "Zend/zend_language_scanner.l" - { - goto return_whitespace; -} -#line 2353 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'N') goto yy204; + if (yych == 'n') goto yy204; + goto yy82; yy92: YYDEBUG(92, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == '=') goto yy153; -yy93: + yych = *++YYCURSOR; + if (yych == '=') goto yy205; YYDEBUG(93, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1692 "Zend/zend_language_scanner.l" +#line 1624 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(yytext[0]); + RETURN_TOKEN(T_POW); } -#line 2365 "Zend/zend_language_scanner.c" +#line 2491 "Zend/zend_language_scanner.c" yy94: YYDEBUG(94, *YYCURSOR); ++YYCURSOR; YYDEBUG(95, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2203 "Zend/zend_language_scanner.l" +#line 1620 "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('"'); + RETURN_TOKEN(T_MUL_EQUAL); } -#line 2416 "Zend/zend_language_scanner.c" +#line 2501 "Zend/zend_language_scanner.c" yy96: YYDEBUG(96, *YYCURSOR); ++YYCURSOR; YYDEBUG(97, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2030 "Zend/zend_language_scanner.l" +#line 1576 "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 (EXPECTED(elem != NULL)) { - SKIP_TOKEN(T_COMMENT); - } - RETURN_TOKEN(T_COMMENT); + RETURN_TOKEN(T_INC); } -#line 2454 "Zend/zend_language_scanner.c" +#line 2511 "Zend/zend_language_scanner.c" yy98: YYDEBUG(98, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '_') { - if (yych <= '@') goto yy93; - if (yych <= 'Z') goto yy155; - if (yych <= '^') goto yy93; - goto yy155; - } else { - if (yych <= '`') goto yy93; - if (yych <= 'z') goto yy155; - if (yych <= 0x7F) goto yy93; - goto yy155; - } -yy99: + ++YYCURSOR; YYDEBUG(99, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '=') goto yy158; - goto yy93; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1612 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_PLUS_EQUAL); +} +#line 2521 "Zend/zend_language_scanner.c" yy100: YYDEBUG(100, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '&') goto yy160; - if (yych == '=') goto yy162; - goto yy93; -yy101: - YYDEBUG(101, *YYCURSOR); ++YYCURSOR; - YYDEBUG(102, *YYCURSOR); + YYDEBUG(101, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2113 "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 2) { + doc_com = 1; + RESET_DOC_COMMENT(); + } else { + doc_com = 0; + } + + while (YYCURSOR < YYLIMIT) { + if (*YYCURSOR++ == '*' && *YYCURSOR == '/') { + break; } - if (yych <= 'D') { - if (yych == '.') goto yy191; - goto yy111; - } else { - if (yych <= 'E') goto yy201; - if (yych == 'e') goto yy201; - goto yy111; + } + + if (YYCURSOR < YYLIMIT) { + YYCURSOR++; + } else { + 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 (EXPECTED(elem != NULL)) { + SKIP_TOKEN(T_DOC_COMMENT); } + RETURN_TOKEN(T_DOC_COMMENT); + } + + if (EXPECTED(elem != NULL)) { + SKIP_TOKEN(T_COMMENT); + } + RETURN_TOKEN(T_COMMENT); +} +#line 2642 "Zend/zend_language_scanner.c" yy114: YYDEBUG(114, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == ':') goto yy203; - goto yy93; -yy115: + ++YYCURSOR; YYDEBUG(115, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= ';') goto yy93; - if (yych <= '<') goto yy205; - if (yych <= '=') goto yy207; - if (yych <= '>') goto yy209; - goto yy93; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1632 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_DIV_EQUAL); +} +#line 2652 "Zend/zend_language_scanner.c" yy116: YYDEBUG(116, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '<') goto yy93; - if (yych <= '=') goto yy210; - if (yych <= '>') goto yy212; - goto yy93; + if (yybm[0+yych] & 64) { + goto yy210; + } + goto yy82; yy117: YYDEBUG(117, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '<') goto yy93; - if (yych <= '=') goto yy214; - if (yych <= '>') goto yy216; - goto yy93; + 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 (yych <= '=') goto yy93; - if (yych <= '>') goto yy218; - if (yych <= '?') goto yy220; - goto yy93; + if (yybm[0+yych] & 128) { + goto yy216; + } + goto yy82; yy119: YYDEBUG(119, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) <= 'S') { - if (yych <= 'M') { - if (yych == 'B') goto yy222; - goto yy128; - } else { - if (yych <= 'N') goto yy223; - if (yych <= 'Q') goto yy128; - if (yych <= 'R') goto yy224; - goto yy225; - } - } else { - if (yych <= 'n') { - if (yych == 'b') goto yy222; - if (yych <= 'm') goto yy128; - goto yy223; - } else { - if (yych <= 'q') goto yy128; - if (yych <= 'r') goto yy224; - if (yych <= 's') goto yy225; - goto yy128; - } - } -yy120: YYDEBUG(120, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2025 "Zend/zend_language_scanner.l" +#line 1428 "Zend/zend_language_scanner.l" { - RETURN_TOKEN_WITH_STR(T_STRING, 0); + RETURN_TOKEN(T_PAAMAYIM_NEKUDOTAYIM); } -#line 2840 "Zend/zend_language_scanner.c" +#line 2688 "Zend/zend_language_scanner.c" yy121: YYDEBUG(121, *YYCURSOR); - yyaccept = 2; + yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= ';') { - if (yych <= '"') { - if (yych <= '!') goto yy128; - goto yy94; - } else { - if (yych == '\'') goto yy101; - goto yy128; - } - } else { - if (yych <= 'R') { - if (yych <= '<') goto yy227; - if (yych <= 'Q') goto yy128; - goto yy228; - } else { - if (yych == 'r') goto yy228; - goto yy128; - } - } + if (yych <= ';') goto yy122; + if (yych <= '<') goto yy219; + if (yych <= '=') goto yy221; yy122: YYDEBUG(122, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'O') { - if (yych <= 'K') { - if (yych == 'A') goto yy229; - goto yy128; - } else { - if (yych <= 'L') goto yy230; - if (yych <= 'N') goto yy128; - goto yy231; - } - } else { - if (yych <= 'k') { - if (yych == 'a') goto yy229; - goto yy128; - } else { - if (yych <= 'l') goto yy230; - if (yych == 'o') goto yy231; - goto yy128; - } - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 1684 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_SL); +} +#line 2703 "Zend/zend_language_scanner.c" yy123: YYDEBUG(123, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'O') { - if (yych <= 'H') { - if (yych == 'E') goto yy232; - goto yy128; - } else { - if (yych <= 'I') goto yy233; - if (yych <= 'N') goto yy128; - goto yy234; - } - } else { - if (yych <= 'h') { - if (yych == 'e') goto yy232; - goto yy128; - } else { - if (yych <= 'i') goto yy233; - if (yych == 'o') goto yy234; - goto yy128; - } - } -yy124: + if (yych == '>') goto yy223; YYDEBUG(124, *YYCURSOR); - yych = *++YYCURSOR; - switch (yych) { - case 'C': - case 'c': goto yy236; - case 'L': - case 'l': goto yy237; - case 'M': - case 'm': goto yy238; - case 'N': - case 'n': goto yy239; - case 'V': - case 'v': goto yy240; - case 'X': - case 'x': goto yy241; - default: goto yy128; - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 1604 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_IS_SMALLER_OR_EQUAL); +} +#line 2714 "Zend/zend_language_scanner.c" yy125: YYDEBUG(125, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'U') { - if (yych <= 'N') { - if (yych == 'I') goto yy242; - goto yy128; - } else { - if (yych <= 'O') goto yy243; - if (yych <= 'T') goto yy128; - goto yy244; - } - } else { - if (yych <= 'n') { - if (yych == 'i') goto yy242; - goto yy128; - } else { - if (yych <= 'o') goto yy243; - if (yych == 'u') goto yy244; - goto yy128; - } - } + ++YYCURSOR; + goto yy70; yy126: YYDEBUG(126, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'O') { - if (yych == 'L') goto yy245; - if (yych <= 'N') goto yy128; - goto yy246; - } else { - if (yych <= 'l') { - if (yych <= 'k') goto yy128; - goto yy245; - } else { - if (yych == 'o') goto yy246; - goto yy128; - } - } -yy127: - YYDEBUG(127, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == '=') goto yy225; + YYDEBUG(127, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1592 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_IS_EQUAL); +} +#line 2729 "Zend/zend_language_scanner.c" yy128: YYDEBUG(128, *YYCURSOR); - if (yybm[0+yych] & 16) { - goto yy127; - } - goto yy120; -yy129: + ++YYCURSOR; YYDEBUG(129, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'S') { - if (yych <= 'L') { - if (yych == 'F') goto yy247; - goto yy128; - } else { - if (yych <= 'M') goto yy249; - if (yych <= 'N') goto yy250; - if (yych <= 'R') goto yy128; - goto yy251; - } - } else { - if (yych <= 'm') { - if (yych == 'f') goto yy247; - if (yych <= 'l') goto yy128; - goto yy249; - } else { - if (yych <= 'n') goto yy250; - if (yych == 's') goto yy251; - goto yy128; - } - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 1560 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_DOUBLE_ARROW); +} +#line 2739 "Zend/zend_language_scanner.c" yy130: YYDEBUG(130, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'I') goto yy252; - if (yych == 'i') goto yy252; - goto yy128; -yy131: + ++YYCURSOR; YYDEBUG(131, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'E') { - if (yych == 'A') goto yy253; - if (yych <= 'D') goto yy128; - goto yy254; - } else { - if (yych <= 'a') { - if (yych <= '`') goto yy128; - goto yy253; - } else { - if (yych == 'e') goto yy254; - goto yy128; - } - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 1608 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_IS_GREATER_OR_EQUAL); +} +#line 2749 "Zend/zend_language_scanner.c" yy132: YYDEBUG(132, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy255; - if (yych == 'r') goto yy255; - goto yy128; -yy133: + if (yych == '=') goto yy227; YYDEBUG(133, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'U') { - if (yych == 'R') goto yy257; - if (yych <= 'T') goto yy128; - goto yy258; - } else { - if (yych <= 'r') { - if (yych <= 'q') goto yy128; - goto yy257; - } else { - if (yych == 'u') goto yy258; - goto yy128; - } - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 1688 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_SR); +} +#line 2760 "Zend/zend_language_scanner.c" yy134: YYDEBUG(134, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy259; - if (yych == 'e') goto yy259; - goto yy128; + if (yych == '\n') goto yy229; + if (yych == '\r') goto yy230; yy135: YYDEBUG(135, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'W') { - if (yych == 'T') goto yy260; - if (yych <= 'V') goto yy128; - goto yy261; - } else { - if (yych <= 't') { - if (yych <= 's') goto yy128; - goto yy260; - } else { - if (yych == 'w') goto yy261; - goto yy128; - } - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 2101 "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 2780 "Zend/zend_language_scanner.c" yy136: YYDEBUG(136, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'R') { - if (yych == 'H') goto yy262; - if (yych <= 'Q') goto yy128; - goto yy263; - } else { - if (yych <= 'h') { - if (yych <= 'g') goto yy128; - goto yy262; - } else { - if (yych == 'r') goto yy263; - goto yy128; - } - } -yy137: + ++YYCURSOR; YYDEBUG(137, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'S') { - if (yych == 'N') goto yy264; - if (yych <= 'R') goto yy128; - goto yy265; - } else { - if (yych <= 'n') { - if (yych <= 'm') goto yy128; - goto yy264; - } else { - if (yych == 's') goto yy265; - goto yy128; - } - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 1440 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_COALESCE); +} +#line 2790 "Zend/zend_language_scanner.c" yy138: YYDEBUG(138, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy266; - if (yych == 'a') goto yy266; - goto yy128; + if (yych == 'S') goto yy231; + if (yych == 's') goto yy231; + goto yy44; yy139: YYDEBUG(139, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy267; - if (yych == 'h') goto yy267; - goto yy128; + if (yych == 'D') goto yy232; + if (yych == 'd') goto yy232; + goto yy44; yy140: YYDEBUG(140, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy268; - if (yych == 'o') goto yy268; - goto yy128; + if (yych == 'R') goto yy234; + if (yych == 'r') goto yy234; + goto yy44; yy141: YYDEBUG(141, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy269; - if (yych == 'i') goto yy269; - goto yy128; -yy142: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(142, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(143, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1432 "Zend/zend_language_scanner.l" +#line 1344 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_NS_SEPARATOR); + RETURN_TOKEN(T_AS); } -#line 3129 "Zend/zend_language_scanner.c" +#line 2821 "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 == '=') goto yy270; - goto yy93; + if (yych == 'E') goto yy236; + if (yych == 'e') goto yy236; + goto yy44; yy145: YYDEBUG(145, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy272; - goto yy128; + 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); - ++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); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2380 "Zend/zend_language_scanner.l" - { - BEGIN(ST_BACKQUOTE); - RETURN_TOKEN('`'); -} -#line 3150 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'N') goto yy242; + if (yych == 'n') goto yy242; + goto yy44; yy148: YYDEBUG(148, *YYCURSOR); - ++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); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1697 "Zend/zend_language_scanner.l" - { - yy_push_state(ST_IN_SCRIPTING); - RETURN_TOKEN('{'); -} -#line 3161 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'E') goto yy245; + if (yych == 'e') goto yy245; + goto yy44; yy150: YYDEBUG(150, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '=') goto yy273; - if (yych == '|') goto yy275; - goto yy93; -yy151: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(151, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(152, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1709 "Zend/zend_language_scanner.l" +#line 1312 "Zend/zend_language_scanner.l" { - RESET_DOC_COMMENT(); - if (!zend_stack_is_empty(&SCNG(state_stack))) { - yy_pop_state(); - } - RETURN_TOKEN('}'); + RETURN_TOKEN(T_DO); } -#line 3181 "Zend/zend_language_scanner.c" +#line 2911 "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); - ++YYCURSOR; - if ((yych = *YYCURSOR) == '=') goto yy277; + yych = *++YYCURSOR; + if (yych == 'S') goto yy248; + if (yych == 's') goto yy248; + goto yy44; yy154: YYDEBUG(154, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1596 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_IS_NOT_EQUAL); -} -#line 3193 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'P') goto yy249; + if (yych == 'p') goto yy249; + goto yy44; yy155: YYDEBUG(155, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'D') goto yy250; + if (yych == 'd') goto yy250; + goto yy44; +yy156: YYDEBUG(156, *YYCURSOR); - if (yych <= '^') { - if (yych <= '9') { - if (yych >= '0') goto yy155; - } else { - if (yych <= '@') goto yy157; - if (yych <= 'Z') goto yy155; - } + 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 <= '`') { - if (yych <= '_') goto yy155; + if (yych <= 'i') { + if (yych <= 'h') goto yy44; + goto yy252; } else { - if (yych <= 'z') goto yy155; - if (yych >= 0x80) goto yy155; + if (yych == 't') goto yy253; + goto yy44; } } -yy157: - YYDEBUG(157, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2003 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); -} -#line 3222 "Zend/zend_language_scanner.c" yy158: YYDEBUG(158, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'N') goto yy254; + if (yych == 'n') goto yy254; + goto yy44; +yy159: YYDEBUG(159, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1640 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_MOD_EQUAL); -} -#line 3232 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'R') goto yy255; + if (yych == 'r') goto yy255; + goto yy44; yy160: YYDEBUG(160, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'N') goto yy257; + if (yych == 'n') goto yy257; + goto yy44; +yy161: YYDEBUG(161, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1668 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_BOOLEAN_AND); -} -#line 3242 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'O') goto yy258; + if (yych == 'o') goto yy258; + goto yy44; yy162: YYDEBUG(162, *YYCURSOR); - ++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 1652 "Zend/zend_language_scanner.l" +#line 1288 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_AND_EQUAL); + RETURN_TOKEN(T_IF); } -#line 3252 "Zend/zend_language_scanner.c" -yy164: - YYDEBUG(164, *YYCURSOR); - ++YYCURSOR; - YYFILL(7); - yych = *YYCURSOR; +#line 3000 "Zend/zend_language_scanner.c" yy165: YYDEBUG(165, *YYCURSOR); - if (yybm[0+yych] & 32) { - goto yy164; - } - switch (yych) { - case 'A': - case 'a': goto yy167; - case 'B': - case 'b': goto yy168; - case 'D': - case 'd': goto yy169; - case 'F': - case 'f': goto yy170; - case 'I': - case 'i': goto yy171; - case 'O': - case 'o': goto yy172; - case 'R': - case 'r': goto yy173; - case 'S': - case 's': goto yy174; - case 'U': - case 'u': goto yy175; - default: goto yy166; - } + yych = *++YYCURSOR; + if (yych == 'P') goto yy260; + if (yych == 'p') goto yy260; + goto yy44; yy166: YYDEBUG(166, *YYCURSOR); - YYCURSOR = YYMARKER; - if (yyaccept <= 3) { - if (yyaccept <= 1) { - if (yyaccept == 0) { - goto yy93; - } else { - goto yy111; - } + yych = *++YYCURSOR; + if (yych <= 'T') { + if (yych <= 'C') { + if (yych <= 'B') goto yy44; + goto yy261; } else { - if (yyaccept == 2) { - goto yy120; - } else { - goto yy193; - } + if (yych <= 'R') goto yy44; + if (yych <= 'S') goto yy262; + goto yy263; } } else { - if (yyaccept <= 5) { - if (yyaccept == 4) { - goto yy197; - } else { - goto yy206; - } + if (yych <= 'r') { + if (yych == 'c') goto yy261; + goto yy44; } else { - goto yy541; + if (yych <= 's') goto yy262; + if (yych <= 't') goto yy263; + goto yy44; } } yy167: YYDEBUG(167, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy279; - if (yych == 'r') goto yy279; - goto yy166; + if (yych == 'S') goto yy264; + if (yych == 's') goto yy264; + goto yy44; yy168: YYDEBUG(168, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'O') { - if (yych == 'I') goto yy280; - if (yych <= 'N') goto yy166; - goto yy281; - } else { - if (yych <= 'i') { - if (yych <= 'h') goto yy166; - goto yy280; - } else { - if (yych == 'o') goto yy281; - goto yy166; - } - } + if (yych == 'S') goto yy265; + if (yych == 's') goto yy265; + goto yy44; yy169: YYDEBUG(169, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy282; - if (yych == 'o') goto yy282; - goto yy166; + if (yych == 'M') goto yy266; + if (yych == 'm') goto yy266; + goto yy44; yy170: YYDEBUG(170, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy283; - if (yych == 'l') goto yy283; - goto yy166; + if (yych == 'W') goto yy267; + if (yych == 'w') goto yy267; + goto yy44; yy171: YYDEBUG(171, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy284; - if (yych == 'n') goto yy284; - goto yy166; -yy172: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(172, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'B') goto yy285; - if (yych == 'b') goto yy285; - goto yy166; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1672 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_LOGICAL_OR); +} +#line 3065 "Zend/zend_language_scanner.c" yy173: YYDEBUG(173, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy286; - if (yych == 'e') goto yy286; - goto yy166; + 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 == 'T') goto yy287; - if (yych == 't') goto yy287; - goto yy166; + if (yych == 'B') goto yy271; + if (yych == 'b') goto yy271; + goto yy44; yy175: YYDEBUG(175, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy288; - if (yych == 'n') goto yy288; - goto yy166; + 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); - ++YYCURSOR; - if ((yych = *YYCURSOR) == '=') goto yy289; + yych = *++YYCURSOR; + if (yych == 'A') goto yy274; + if (yych == 'a') goto yy274; + goto yy44; +yy177: YYDEBUG(177, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1624 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_POW); -} -#line 3386 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'I') goto yy275; + if (yych == 'i') goto yy275; + goto yy44; yy178: YYDEBUG(178, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'R') goto yy276; + if (yych == 'r') goto yy276; + goto yy44; +yy179: YYDEBUG(179, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1620 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_MUL_EQUAL); -} -#line 3396 "Zend/zend_language_scanner.c" + 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); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'S') goto yy280; + if (yych == 's') goto yy280; + goto yy44; +yy181: YYDEBUG(181, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1576 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_INC); -} -#line 3406 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'E') goto yy281; + if (yych == 'e') goto yy281; + goto yy44; yy182: YYDEBUG(182, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'R') goto yy283; + if (yych == 'r') goto yy283; + goto yy44; +yy183: YYDEBUG(183, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1612 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_PLUS_EQUAL); -} -#line 3416 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'I') goto yy285; + if (yych == 'i') goto yy285; + goto yy44; yy184: YYDEBUG(184, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'R') goto yy286; + if (yych == 'r') goto yy286; + goto yy44; +yy185: YYDEBUG(185, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1580 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_DEC); -} -#line 3426 "Zend/zend_language_scanner.c" + 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 1616 "Zend/zend_language_scanner.l" +#line 1660 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_MINUS_EQUAL); + RETURN_TOKEN(T_XOR_EQUAL); } -#line 3436 "Zend/zend_language_scanner.c" +#line 3183 "Zend/zend_language_scanner.c" yy188: YYDEBUG(188, *YYCURSOR); - ++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 1404 "Zend/zend_language_scanner.l" +#line 1656 "Zend/zend_language_scanner.l" { - yy_push_state(ST_LOOKING_FOR_PROPERTY); - RETURN_TOKEN(T_OBJECT_OPERATOR); + RETURN_TOKEN(T_OR_EQUAL); } -#line 3447 "Zend/zend_language_scanner.c" -yy190: - YYDEBUG(190, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '.') goto yy291; - goto yy166; +#line 3215 "Zend/zend_language_scanner.c" yy191: YYDEBUG(191, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(3); - yych = *YYCURSOR; + ++YYCURSOR; YYDEBUG(192, *YYCURSOR); - if (yych <= 'D') { - if (yych <= '/') goto yy193; - if (yych <= '9') goto yy191; - } else { - if (yych <= 'E') goto yy201; - if (yych == 'e') goto yy201; - } -yy193: - YYDEBUG(193, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1865 "Zend/zend_language_scanner.l" +#line 1664 "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); + RETURN_TOKEN(T_BOOLEAN_OR); } -#line 3479 "Zend/zend_language_scanner.c" -yy194: - YYDEBUG(194, *YYCURSOR); +#line 3225 "Zend/zend_language_scanner.c" +yy193: + YYDEBUG(193, *YYCURSOR); ++YYCURSOR; - YYDEBUG(195, *YYCURSOR); + YYDEBUG(194, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1636 "Zend/zend_language_scanner.l" +#line 1588 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_CONCAT_EQUAL); + RETURN_TOKEN(T_IS_NOT_IDENTICAL); } -#line 3489 "Zend/zend_language_scanner.c" +#line 3235 "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); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych == '*') goto yy293; + yych = *++YYCURSOR; + if (yych == 'N') goto yy298; + if (yych == 'n') goto yy298; + goto yy82; yy197: YYDEBUG(197, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2062 "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 { - 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 (EXPECTED(elem != NULL)) { - SKIP_TOKEN(T_DOC_COMMENT); - } - RETURN_TOKEN(T_DOC_COMMENT); - } - - if (EXPECTED(elem != NULL)) { - SKIP_TOKEN(T_COMMENT); - } - RETURN_TOKEN(T_COMMENT); -} -#line 3537 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'O') goto yy299; + if (yych == 'o') goto yy299; + goto yy82; yy198: YYDEBUG(198, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'U') goto yy300; + if (yych == 'u') goto yy300; + goto yy82; +yy199: YYDEBUG(199, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1632 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_DIV_EQUAL); -} -#line 3547 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'O') goto yy301; + if (yych == 'o') goto yy301; + goto yy82; yy200: YYDEBUG(200, *YYCURSOR); yych = *++YYCURSOR; - if (yybm[0+yych] & 64) { - goto yy294; - } - goto yy166; + if (yych == 'T') goto yy302; + if (yych == 't') goto yy302; + goto yy82; yy201: YYDEBUG(201, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= ',') { - if (yych == '+') goto yy297; - goto yy166; - } else { - if (yych <= '-') goto yy297; - if (yych <= '/') goto yy166; - if (yych <= '9') goto yy298; - goto yy166; - } + if (yych == 'J') goto yy303; + if (yych == 'j') goto yy303; + goto yy82; yy202: YYDEBUG(202, *YYCURSOR); yych = *++YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy300; - } - goto yy166; + if (yych == 'A') goto yy304; + if (yych == 'a') goto yy304; + goto yy82; yy203: YYDEBUG(203, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'R') goto yy305; + if (yych == 'r') goto yy305; + goto yy82; +yy204: YYDEBUG(204, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1428 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_PAAMAYIM_NEKUDOTAYIM); -} -#line 3583 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'S') goto yy306; + if (yych == 's') goto yy306; + goto yy82; yy205: YYDEBUG(205, *YYCURSOR); - yyaccept = 5; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= ';') goto yy206; - if (yych <= '<') goto yy303; - if (yych <= '=') goto yy305; -yy206: + ++YYCURSOR; YYDEBUG(206, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1684 "Zend/zend_language_scanner.l" +#line 1628 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_SL); + RETURN_TOKEN(T_POW_EQUAL); } -#line 3598 "Zend/zend_language_scanner.c" +#line 3305 "Zend/zend_language_scanner.c" yy207: YYDEBUG(207, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) == '>') goto yy307; YYDEBUG(208, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1604 "Zend/zend_language_scanner.l" +#line 1436 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_IS_SMALLER_OR_EQUAL); + RETURN_TOKEN(T_ELLIPSIS); } -#line 3609 "Zend/zend_language_scanner.c" +#line 3315 "Zend/zend_language_scanner.c" yy209: YYDEBUG(209, *YYCURSOR); yych = *++YYCURSOR; - goto yy154; + 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; - if ((yych = *YYCURSOR) == '=') goto yy309; + YYFILL(1); + yych = *YYCURSOR; YYDEBUG(211, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1592 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_IS_EQUAL); -} -#line 3624 "Zend/zend_language_scanner.c" -yy212: + if (yybm[0+yych] & 64) { + goto yy210; + } YYDEBUG(212, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(213, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1560 "Zend/zend_language_scanner.l" +#line 1733 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_DOUBLE_ARROW); + 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 3634 "Zend/zend_language_scanner.c" +#line 3367 "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); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1608 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_IS_GREATER_OR_EQUAL); -} -#line 3644 "Zend/zend_language_scanner.c" + if (yych <= '/') goto yy109; + if (yych <= '9') goto yy214; + goto yy109; yy216: YYDEBUG(216, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) == '=') goto yy311; - YYDEBUG(217, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1688 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_SR); -} -#line 3655 "Zend/zend_language_scanner.c" -yy218: + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(217, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy216; + } YYDEBUG(218, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == '\n') goto yy313; - if (yych == '\r') goto yy314; -yy219: - YYDEBUG(219, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2101 "Zend/zend_language_scanner.l" +#line 1812 "Zend/zend_language_scanner.l" { - BEGIN(INITIAL); - if (yytext[yyleng-1] != '>') { - CG(increment_lineno) = 1; + char *hex = yytext + 2; /* Skip "0x" */ + int len = yyleng - 2; + char *end; + + /* Skip any leading 0s */ + while (*hex == '0') { + hex++; + len--; } - if (PARSER_MODE()) { - RETURN_TOKEN(';'); /* implicit ';' at php-end tag */ + + 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); } - RETURN_TOKEN(T_CLOSE_TAG); } -#line 3675 "Zend/zend_language_scanner.c" -yy220: - YYDEBUG(220, *YYCURSOR); +#line 3421 "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 1440 "Zend/zend_language_scanner.l" +#line 1644 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_COALESCE); + RETURN_TOKEN(T_SL_EQUAL); } -#line 3685 "Zend/zend_language_scanner.c" -yy222: - YYDEBUG(222, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'S') goto yy315; - if (yych == 's') goto yy315; - goto yy128; +#line 3460 "Zend/zend_language_scanner.c" yy223: YYDEBUG(223, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'D') goto yy316; - if (yych == 'd') goto yy316; - goto yy128; -yy224: + ++YYCURSOR; YYDEBUG(224, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy318; - if (yych == 'r') goto yy318; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1600 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_SPACESHIP); +} +#line 3470 "Zend/zend_language_scanner.c" yy225: YYDEBUG(225, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } YYDEBUG(226, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1344 "Zend/zend_language_scanner.l" +#line 1584 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_AS); + RETURN_TOKEN(T_IS_IDENTICAL); } -#line 3716 "Zend/zend_language_scanner.c" +#line 3480 "Zend/zend_language_scanner.c" yy227: YYDEBUG(227, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '<') goto yy319; - goto yy166; -yy228: + ++YYCURSOR; YYDEBUG(228, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy320; - if (yych == 'e') goto yy320; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1648 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_SR_EQUAL); +} +#line 3490 "Zend/zend_language_scanner.c" yy229: YYDEBUG(229, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'T') { - if (yych <= 'L') { - if (yych <= 'K') goto yy128; - goto yy321; - } else { - if (yych <= 'R') goto yy128; - if (yych <= 'S') goto yy322; - goto yy323; - } - } else { - if (yych <= 'r') { - if (yych == 'l') goto yy321; - goto yy128; - } else { - if (yych <= 's') goto yy322; - if (yych <= 't') goto yy323; - goto yy128; - } - } + ++YYCURSOR; + goto yy135; yy230: YYDEBUG(230, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'O') { - if (yych == 'A') goto yy324; - if (yych <= 'N') goto yy128; - goto yy325; - } else { - if (yych <= 'a') { - if (yych <= '`') goto yy128; - goto yy324; - } else { - if (yych == 'o') goto yy325; - goto yy128; - } - } + if (yych == '\n') goto yy229; + goto yy135; yy231: YYDEBUG(231, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy326; - if (yych == 'n') goto yy326; - goto yy128; + if (yych == 'T') goto yy313; + if (yych == 't') goto yy313; + goto yy44; yy232: YYDEBUG(232, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'F') { - if (yych == 'C') goto yy327; - if (yych <= 'E') goto yy128; - goto yy328; - } else { - if (yych <= 'c') { - if (yych <= 'b') goto yy128; - goto yy327; - } else { - if (yych == 'f') goto yy328; - goto yy128; - } + if (yybm[0+yych] & 16) { + goto yy43; } -yy233: YYDEBUG(233, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy329; - if (yych == 'e') goto yy329; - goto yy128; -yy234: - YYDEBUG(234, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(235, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1312 "Zend/zend_language_scanner.l" +#line 1676 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_DO); + RETURN_TOKEN(T_LOGICAL_AND); } -#line 3806 "Zend/zend_language_scanner.c" +#line 3518 "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 == 'H') goto yy331; - if (yych == 'h') goto yy331; - goto yy128; + if (yych == 'A') goto yy315; + if (yych == 'a') goto yy315; + goto yy44; yy237: YYDEBUG(237, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy332; - if (yych == 's') goto yy332; - goto yy128; + if (yych == 'L') goto yy316; + if (yych == 'l') goto yy316; + goto yy44; yy238: YYDEBUG(238, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy333; - if (yych == 'p') goto yy333; - goto yy128; + if (yych == 'E') goto yy317; + if (yych == 'e') goto yy317; + goto yy44; yy239: YYDEBUG(239, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy334; - if (yych == 'd') goto yy334; - goto yy128; + if (yych == 'C') goto yy319; + if (yych == 'c') goto yy319; + goto yy44; yy240: YYDEBUG(240, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy335; - if (yych == 'a') goto yy335; - goto yy128; + if (yych == 'S') goto yy320; + if (yych == 's') goto yy320; + goto yy44; yy241: YYDEBUG(241, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'T') { - if (yych == 'I') goto yy336; - if (yych <= 'S') goto yy128; - goto yy337; - } else { - if (yych <= 'i') { - if (yych <= 'h') goto yy128; - goto yy336; - } else { - if (yych == 't') goto yy337; - goto yy128; - } - } + if (yych == 'N') goto yy321; + if (yych == 'n') goto yy321; + goto yy44; yy242: YYDEBUG(242, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy338; - if (yych == 'n') goto yy338; - goto yy128; + 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 == 'R') goto yy339; - if (yych == 'r') goto yy339; - goto yy128; + if (yych == 'L') goto yy324; + if (yych == 'l') goto yy324; + goto yy44; yy244: YYDEBUG(244, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy341; - if (yych == 'n') goto yy341; - goto yy128; + if (yych == 'A') goto yy325; + if (yych == 'a') goto yy325; + goto yy44; yy245: YYDEBUG(245, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy342; - if (yych == 'o') goto yy342; - goto yy128; -yy246: - YYDEBUG(246, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy343; - if (yych == 't') goto yy343; - goto yy128; -yy247: - YYDEBUG(247, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(248, *YYCURSOR); + YYDEBUG(246, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1288 "Zend/zend_language_scanner.l" +#line 1246 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_IF); + RETURN_TOKEN(T_EXIT); } -#line 3895 "Zend/zend_language_scanner.c" +#line 3603 "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 == 'P') goto yy344; - if (yych == 'p') goto yy344; - goto yy128; + if (yych == 'T') goto yy330; + if (yych == 't') goto yy330; + goto yy44; yy250: YYDEBUG(250, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'T') { - if (yych <= 'C') { - if (yych <= 'B') goto yy128; - goto yy345; - } else { - if (yych <= 'R') goto yy128; - if (yych <= 'S') goto yy346; - goto yy347; - } - } else { - if (yych <= 'r') { - if (yych == 'c') goto yy345; - goto yy128; - } else { - if (yych <= 's') goto yy346; - if (yych <= 't') goto yy347; - goto yy128; - } + 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 == 'S') goto yy348; - if (yych == 's') goto yy348; - goto yy128; + if (yych == 'L') goto yy336; + if (yych == 'l') goto yy336; + goto yy44; yy252: YYDEBUG(252, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy349; - if (yych == 's') goto yy349; - goto yy128; + if (yych == 'T') goto yy338; + if (yych == 't') goto yy338; + goto yy44; yy253: YYDEBUG(253, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy350; - if (yych == 'm') goto yy350; - goto yy128; + if (yych == 'E') goto yy340; + if (yych == 'e') goto yy340; + goto yy44; yy254: YYDEBUG(254, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'W') goto yy351; - if (yych == 'w') goto yy351; - goto yy128; + if (yych == 'A') goto yy341; + if (yych == 'a') goto yy341; + goto yy44; yy255: YYDEBUG(255, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + 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 1672 "Zend/zend_language_scanner.l" +#line 1316 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_LOGICAL_OR); + RETURN_TOKEN(T_FOR); } -#line 3960 "Zend/zend_language_scanner.c" +#line 3689 "Zend/zend_language_scanner.c" yy257: YYDEBUG(257, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'O') { - if (yych == 'I') goto yy353; - if (yych <= 'N') goto yy128; - goto yy354; - } else { - if (yych <= 'i') { - if (yych <= 'h') goto yy128; - goto yy353; - } else { - if (yych == 'o') goto yy354; - goto yy128; - } - } + if (yych == 'C') goto yy343; + if (yych == 'c') goto yy343; + goto yy44; yy258: YYDEBUG(258, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy355; - if (yych == 'b') goto yy355; - goto yy128; + if (yych == 'B') goto yy344; + if (yych == 'b') goto yy344; + goto yy44; yy259: YYDEBUG(259, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'T') { - if (yych == 'Q') goto yy356; - if (yych <= 'S') goto yy128; - goto yy357; - } else { - if (yych <= 'q') { - if (yych <= 'p') goto yy128; - goto yy356; - } else { - if (yych == 't') goto yy357; - goto yy128; - } - } + if (yych == 'O') goto yy345; + if (yych == 'o') goto yy345; + goto yy44; yy260: YYDEBUG(260, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy358; - if (yych == 'a') goto yy358; - goto yy128; + if (yych == 'L') goto yy347; + if (yych == 'l') goto yy347; + goto yy44; yy261: YYDEBUG(261, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy359; - if (yych == 'i') goto yy359; - goto yy128; + if (yych == 'L') goto yy348; + if (yych == 'l') goto yy348; + goto yy44; yy262: YYDEBUG(262, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy360; - if (yych == 'r') goto yy360; - goto yy128; + if (yych == 'T') goto yy349; + if (yych == 't') goto yy349; + goto yy44; yy263: YYDEBUG(263, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'Y') { - if (yych == 'A') goto yy361; - if (yych <= 'X') goto yy128; - goto yy362; - } else { - if (yych <= 'a') { - if (yych <= '`') goto yy128; - goto yy361; - } else { - if (yych == 'y') goto yy362; - goto yy128; - } - } + if (yych == 'E') goto yy350; + if (yych == 'e') goto yy350; + goto yy44; yy264: YYDEBUG(264, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy364; - if (yych == 's') goto yy364; - goto yy128; + if (yych == 'E') goto yy351; + if (yych == 'e') goto yy351; + goto yy44; yy265: YYDEBUG(265, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy365; - if (yych == 'e') goto yy365; - goto yy128; + if (yych == 'T') goto yy352; + if (yych == 't') goto yy352; + goto yy44; yy266: YYDEBUG(266, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy367; - if (yych == 'r') goto yy367; - goto yy128; + if (yych == 'E') goto yy354; + if (yych == 'e') goto yy354; + goto yy44; yy267: YYDEBUG(267, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy369; - if (yych == 'i') goto yy369; - goto yy128; -yy268: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(268, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy370; - if (yych == 'r') goto yy370; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1444 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_NEW); +} +#line 3762 "Zend/zend_language_scanner.c" yy269: YYDEBUG(269, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy372; - if (yych == 'e') goto yy372; - goto yy128; + 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); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'T') goto yy357; + if (yych == 't') goto yy357; + goto yy44; +yy271: YYDEBUG(271, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1660 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_XOR_EQUAL); -} -#line 4078 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'L') goto yy358; + if (yych == 'l') goto yy358; + goto yy44; yy272: YYDEBUG(272, *YYCURSOR); yych = *++YYCURSOR; - switch (yych) { - case 'C': - case 'c': goto yy373; - case 'D': - case 'd': goto yy374; - case 'F': - case 'f': goto yy375; - case 'H': - case 'h': goto yy376; - case 'L': - case 'l': goto yy377; - case 'M': - case 'm': goto yy378; - case 'N': - case 'n': goto yy379; - case 'T': - case 't': goto yy380; - default: goto yy128; - } + if (yych == 'U') goto yy359; + if (yych == 'u') goto yy359; + goto yy44; yy273: YYDEBUG(273, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'U') goto yy360; + if (yych == 'u') goto yy360; + goto yy44; +yy274: YYDEBUG(274, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1656 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_OR_EQUAL); -} -#line 4110 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'T') goto yy361; + if (yych == 't') goto yy361; + goto yy44; yy275: YYDEBUG(275, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'T') goto yy362; + if (yych == 't') goto yy362; + goto yy44; +yy276: YYDEBUG(276, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1664 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_BOOLEAN_OR); -} -#line 4120 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'O') goto yy363; + if (yych == 'o') goto yy363; + goto yy44; yy277: YYDEBUG(277, *YYCURSOR); - ++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 1588 "Zend/zend_language_scanner.l" +#line 1272 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_IS_NOT_IDENTICAL); -} -#line 4130 "Zend/zend_language_scanner.c" -yy279: - YYDEBUG(279, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy381; - if (yych == 'r') goto yy381; - goto yy166; + RETURN_TOKEN(T_TRY); +} +#line 3839 "Zend/zend_language_scanner.c" yy280: YYDEBUG(280, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy382; - if (yych == 'n') goto yy382; - goto yy166; + if (yych == 'E') goto yy365; + if (yych == 'e') goto yy365; + goto yy44; yy281: YYDEBUG(281, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy383; - if (yych == 'o') goto yy383; - goto yy166; -yy282: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(282, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'U') goto yy384; - if (yych == 'u') goto yy384; - goto yy166; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1508 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_USE); +} +#line 3858 "Zend/zend_language_scanner.c" yy283: YYDEBUG(283, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy385; - if (yych == 'o') goto yy385; - goto yy166; -yy284: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(284, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy386; - if (yych == 't') goto yy386; - goto yy166; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1452 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_VAR); +} +#line 3871 "Zend/zend_language_scanner.c" yy285: YYDEBUG(285, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'J') goto yy387; - if (yych == 'j') goto yy387; - goto yy166; + if (yych == 'L') goto yy366; + if (yych == 'l') goto yy366; + goto yy44; yy286: YYDEBUG(286, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy388; - if (yych == 'a') goto yy388; - goto yy166; -yy287: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(287, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy389; - if (yych == 'r') goto yy389; - goto yy166; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1680 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_LOGICAL_XOR); +} +#line 3890 "Zend/zend_language_scanner.c" yy288: YYDEBUG(288, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy390; - if (yych == 's') goto yy390; - goto yy166; + if (yych == 'L') goto yy367; + if (yych == 'l') goto yy367; + goto yy44; yy289: YYDEBUG(289, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'L') goto yy368; + if (yych == 'l') goto yy368; + goto yy44; +yy290: YYDEBUG(290, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1628 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_POW_EQUAL); -} -#line 4200 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'I') goto yy369; + if (yych == 'i') goto yy369; + goto yy44; yy291: YYDEBUG(291, *YYCURSOR); - ++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); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1436 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_ELLIPSIS); -} -#line 4210 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'A') goto yy372; + if (yych == 'a') goto yy372; + goto yy44; yy293: YYDEBUG(293, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '\f') { - if (yych <= 0x08) goto yy166; - if (yych <= '\n') goto yy391; - goto yy166; - } else { - if (yych <= '\r') goto yy391; - if (yych == ' ') goto yy391; - goto yy166; - } + if (yych == 'I') goto yy373; + if (yych == 'i') goto yy373; + goto yy44; yy294: YYDEBUG(294, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'E') goto yy374; + if (yych == 'e') goto yy374; + goto yy44; +yy295: YYDEBUG(295, *YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy294; - } + yych = *++YYCURSOR; + if (yych == 'A') goto yy375; + if (yych == 'a') goto yy375; + goto yy44; +yy296: YYDEBUG(296, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1733 "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 4262 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'R') goto yy376; + if (yych == 'r') goto yy376; + goto yy44; yy297: YYDEBUG(297, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '/') goto yy166; - if (yych >= ':') goto yy166; + if (yych == 'A') goto yy377; + if (yych == 'a') goto yy377; + goto yy82; yy298: YYDEBUG(298, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'A') goto yy378; + if (yych == 'a') goto yy378; + goto yy82; +yy299: YYDEBUG(299, *YYCURSOR); - if (yych <= '/') goto yy193; - if (yych <= '9') goto yy298; - goto yy193; + yych = *++YYCURSOR; + if (yych == 'L') goto yy379; + if (yych == 'l') goto yy379; + goto yy82; yy300: YYDEBUG(300, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'B') goto yy380; + if (yych == 'b') goto yy380; + goto yy82; +yy301: YYDEBUG(301, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy300; - } + yych = *++YYCURSOR; + if (yych == 'A') goto yy381; + if (yych == 'a') goto yy381; + goto yy82; +yy302: YYDEBUG(302, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1812 "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 4316 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'E') goto yy386; + if (yych == 'e') goto yy386; + goto yy383; yy303: YYDEBUG(303, *YYCURSOR); - ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'E') goto yy387; + if (yych == 'e') goto yy387; + goto yy82; +yy304: YYDEBUG(304, *YYCURSOR); - if (yych <= '\'') { - if (yych <= ' ') { - if (yych == '\t') goto yy303; - if (yych <= 0x1F) goto yy166; - goto yy303; - } else { - if (yych == '"') goto yy393; - if (yych <= '&') goto yy166; - goto yy394; - } - } else { - if (yych <= '_') { - if (yych <= '@') goto yy166; - if (yych <= 'Z') goto yy395; - if (yych <= '^') goto yy166; - goto yy395; - } else { - if (yych <= '`') goto yy166; - if (yych <= 'z') goto yy395; - if (yych <= 0x7F) goto yy166; - goto yy395; - } - } + yych = *++YYCURSOR; + if (yych == 'L') goto yy388; + if (yych == 'l') goto yy388; + goto yy82; yy305: YYDEBUG(305, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'I') goto yy390; + if (yych == 'i') goto yy390; + goto yy82; +yy306: YYDEBUG(306, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1644 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_SL_EQUAL); -} -#line 4355 "Zend/zend_language_scanner.c" + 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); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1600 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_SPACESHIP); -} -#line 4365 "Zend/zend_language_scanner.c" + 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); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == '"') goto yy82; + if (yych <= '/') goto yy393; + if (yych <= '9') goto yy82; + goto yy393; +yy310: YYDEBUG(310, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1584 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_IS_IDENTICAL); -} -#line 4375 "Zend/zend_language_scanner.c" + 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); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1648 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_SR_EQUAL); -} -#line 4385 "Zend/zend_language_scanner.c" + 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; - goto yy219; + if (yych == 'R') goto yy399; + if (yych == 'r') goto yy399; + goto yy44; yy314: YYDEBUG(314, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy313; - goto yy219; + if (yych == 'Y') goto yy400; + if (yych == 'y') goto yy400; + goto yy44; yy315: YYDEBUG(315, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy397; - if (yych == 't') goto yy397; - goto yy128; + if (yych == 'K') goto yy402; + if (yych == 'k') goto yy402; + goto yy44; yy316: YYDEBUG(316, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + 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 1676 "Zend/zend_language_scanner.l" +#line 1356 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_LOGICAL_AND); + RETURN_TOKEN(T_CASE); } -#line 4413 "Zend/zend_language_scanner.c" -yy318: - YYDEBUG(318, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy398; - if (yych == 'a') goto yy398; - goto yy128; +#line 4108 "Zend/zend_language_scanner.c" yy319: YYDEBUG(319, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '<') goto yy303; - goto yy166; + if (yych == 'H') goto yy405; + if (yych == 'h') goto yy405; + goto yy44; yy320: YYDEBUG(320, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy399; - if (yych == 'a') goto yy399; - goto yy128; + if (yych == 'S') goto yy407; + if (yych == 's') goto yy407; + goto yy44; yy321: YYDEBUG(321, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy400; - if (yych == 'l') goto yy400; - goto yy128; + if (yych == 'E') goto yy409; + if (yych == 'e') goto yy409; + goto yy44; yy322: YYDEBUG(322, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy401; - if (yych == 'e') goto yy401; - goto yy128; + if (yych == 'T') goto yy411; + if (yych == 't') goto yy411; + goto yy44; yy323: YYDEBUG(323, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy403; - if (yych == 'c') goto yy403; - goto yy128; + if (yych == 'I') goto yy413; + if (yych == 'i') goto yy413; + goto yy44; yy324: YYDEBUG(324, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy404; - if (yych == 's') goto yy404; - goto yy128; + if (yych == 'A') goto yy414; + if (yych == 'a') goto yy414; + goto yy44; yy325: YYDEBUG(325, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy405; - if (yych == 'n') goto yy405; - goto yy128; + if (yych == 'U') goto yy415; + if (yych == 'u') goto yy415; + goto yy44; yy326: YYDEBUG(326, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'T') { - if (yych <= 'R') goto yy128; - if (yych <= 'S') goto yy406; - goto yy407; - } else { - if (yych <= 'r') goto yy128; - if (yych <= 's') goto yy406; - if (yych <= 't') goto yy407; - goto yy128; + if (yybm[0+yych] & 16) { + goto yy43; } -yy327: YYDEBUG(327, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy408; - if (yych == 'l') goto yy408; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1376 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_ECHO); +} +#line 4163 "Zend/zend_language_scanner.c" yy328: YYDEBUG(328, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy409; - if (yych == 'a') goto yy409; - goto yy128; + 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); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(330, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1246 "Zend/zend_language_scanner.l" +#line 1300 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_EXIT); + RETURN_TOKEN(T_ELSE); } -#line 4498 "Zend/zend_language_scanner.c" +#line 4191 "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 == 'O') goto yy410; - if (yych == 'o') goto yy410; - goto yy128; + if (yych == 'E') goto yy419; + if (yych == 'e') goto yy419; + goto yy44; yy332: YYDEBUG(332, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy412; - if (yych == 'e') goto yy412; - goto yy128; + if (yych == 'O') goto yy420; + if (yych == 'o') goto yy420; + goto yy44; yy333: YYDEBUG(333, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy414; - if (yych == 't') goto yy414; - goto yy128; + if (yych == 'F') goto yy421; + if (yych == 'f') goto yy421; + goto yy44; yy334: YYDEBUG(334, *YYCURSOR); yych = *++YYCURSOR; - switch (yych) { - case 'D': - case 'd': goto yy415; - case 'F': - case 'f': goto yy416; - case 'I': - case 'i': goto yy417; - case 'S': - case 's': goto yy418; - case 'W': - case 'w': goto yy419; - default: goto yy128; - } + if (yych == 'W') goto yy423; + if (yych == 'w') goto yy423; + goto yy44; yy335: YYDEBUG(335, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy420; - if (yych == 'l') goto yy420; - goto yy128; + if (yych == 'H') goto yy424; + if (yych == 'h') goto yy424; + goto yy44; yy336: YYDEBUG(336, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy422; - if (yych == 't') goto yy422; - goto yy128; -yy337: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(337, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy424; - if (yych == 'e') goto yy424; - goto yy128; -yy338: - YYDEBUG(338, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy425; - if (yych == 'a') goto yy425; - goto yy128; -yy339: - YYDEBUG(339, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '^') { - if (yych <= '@') { - if (yych <= '/') goto yy340; - if (yych <= '9') goto yy127; - } else { - if (yych == 'E') goto yy426; - if (yych <= 'Z') goto yy127; - } - } else { - if (yych <= 'd') { - if (yych != '`') goto yy127; - } else { - if (yych <= 'e') goto yy426; - if (yych <= 'z') goto yy127; - if (yych >= 0x80) goto yy127; - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 1484 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_EVAL); +} +#line 4240 "Zend/zend_language_scanner.c" +yy338: + YYDEBUG(338, *YYCURSOR); + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } -yy340: - YYDEBUG(340, *YYCURSOR); + YYDEBUG(339, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1316 "Zend/zend_language_scanner.l" +#line 1242 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_FOR); + RETURN_TOKEN(T_EXIT); } -#line 4584 "Zend/zend_language_scanner.c" +#line 4253 "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 == 'C') goto yy427; - if (yych == 'c') goto yy427; - goto yy128; + if (yych == 'L') goto yy426; + if (yych == 'l') goto yy426; + goto yy44; yy342: YYDEBUG(342, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy428; - if (yych == 'b') goto yy428; - goto yy128; + if (yych == 'A') goto yy428; + if (yych == 'a') goto yy428; + goto yy44; yy343: YYDEBUG(343, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy429; - if (yych == 'o') goto yy429; - goto yy128; + if (yych == 'T') goto yy429; + if (yych == 't') goto yy429; + goto yy44; yy344: YYDEBUG(344, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy431; - if (yych == 'l') goto yy431; - goto yy128; + if (yych == 'A') goto yy430; + if (yych == 'a') goto yy430; + goto yy44; yy345: YYDEBUG(345, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy432; - if (yych == 'l') goto yy432; - goto yy128; -yy346: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(346, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy433; - if (yych == 't') goto yy433; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1372 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_GOTO); +} +#line 4296 "Zend/zend_language_scanner.c" yy347: YYDEBUG(347, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy434; - if (yych == 'e') goto yy434; - goto yy128; + if (yych == 'E') goto yy431; + if (yych == 'e') goto yy431; + goto yy44; yy348: YYDEBUG(348, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy435; - if (yych == 'e') goto yy435; - goto yy128; + if (yych == 'U') goto yy432; + if (yych == 'u') goto yy432; + goto yy44; yy349: YYDEBUG(349, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy436; - if (yych == 't') goto yy436; - goto yy128; + 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 == 'E') goto yy438; - if (yych == 'e') goto yy438; - goto yy128; + if (yych == 'R') goto yy435; + if (yych == 'r') goto yy435; + goto yy44; yy351: YYDEBUG(351, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + 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 1444 "Zend/zend_language_scanner.l" +#line 1564 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_NEW); + RETURN_TOKEN(T_LIST); } -#line 4657 "Zend/zend_language_scanner.c" -yy353: - YYDEBUG(353, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'V') { - if (yych == 'N') goto yy439; - if (yych <= 'U') goto yy128; - goto yy440; - } else { - if (yych <= 'n') { - if (yych <= 'm') goto yy128; - goto yy439; - } else { - if (yych == 'v') goto yy440; - goto yy128; - } - } +#line 4349 "Zend/zend_language_scanner.c" yy354: YYDEBUG(354, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy441; - if (yych == 't') goto yy441; - goto yy128; + if (yych == 'S') goto yy438; + if (yych == 's') goto yy438; + goto yy44; yy355: YYDEBUG(355, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy442; - if (yych == 'l') goto yy442; - goto yy128; + if (yych == 'T') goto yy439; + if (yych == 't') goto yy439; + goto yy44; yy356: YYDEBUG(356, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy443; - if (yych == 'u') goto yy443; - goto yy128; + if (yych == 'A') goto yy441; + if (yych == 'a') goto yy441; + goto yy44; yy357: YYDEBUG(357, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy444; - if (yych == 'u') goto yy444; - goto yy128; + if (yych == 'E') goto yy442; + if (yych == 'e') goto yy442; + goto yy44; yy358: YYDEBUG(358, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy445; - if (yych == 't') goto yy445; - goto yy128; + if (yych == 'I') goto yy443; + if (yych == 'i') goto yy443; + goto yy44; yy359: YYDEBUG(359, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy446; - if (yych == 't') goto yy446; - goto yy128; + if (yych == 'I') goto yy444; + if (yych == 'i') goto yy444; + goto yy44; yy360: YYDEBUG(360, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy447; - if (yych == 'o') goto yy447; - goto yy128; + if (yych == 'R') goto yy445; + if (yych == 'r') goto yy445; + goto yy44; yy361: YYDEBUG(361, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy448; - if (yych == 'i') goto yy448; - goto yy128; + if (yych == 'I') goto yy446; + if (yych == 'i') goto yy446; + goto yy44; yy362: YYDEBUG(362, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'C') goto yy447; + if (yych == 'c') goto yy447; + goto yy44; +yy363: YYDEBUG(363, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1272 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_TRY); -} -#line 4734 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'W') goto yy448; + if (yych == 'w') goto yy448; + goto yy44; yy364: YYDEBUG(364, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy449; - if (yych == 'e') goto yy449; - goto yy128; + if (yych == 'T') goto yy450; + if (yych == 't') goto yy450; + goto yy44; yy365: YYDEBUG(365, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'T') goto yy452; + if (yych == 't') goto yy452; + goto yy44; +yy366: YYDEBUG(366, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1508 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_USE); -} -#line 4753 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'E') goto yy454; + if (yych == 'e') goto yy454; + goto yy44; yy367: YYDEBUG(367, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'D') goto yy456; + if (yych == 'd') goto yy456; + goto yy44; +yy368: YYDEBUG(368, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1452 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_VAR); -} -#line 4766 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'A') goto yy458; + if (yych == 'a') goto yy458; + goto yy44; yy369: YYDEBUG(369, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy450; - if (yych == 'l') goto yy450; - goto yy128; + if (yych == 'R') goto yy459; + if (yych == 'r') goto yy459; + goto yy44; yy370: YYDEBUG(370, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'L') goto yy460; + if (yych == 'l') goto yy460; + goto yy44; +yy371: YYDEBUG(371, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1680 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_LOGICAL_XOR); -} -#line 4785 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'N') goto yy461; + if (yych == 'n') goto yy461; + goto yy44; yy372: YYDEBUG(372, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy451; - if (yych == 'l') goto yy451; - goto yy128; + if (yych == 'L') goto yy462; + if (yych == 'l') goto yy462; + goto yy44; yy373: YYDEBUG(373, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy452; - if (yych == 'l') goto yy452; - goto yy128; + if (yych == 'N') goto yy463; + if (yych == 'n') goto yy463; + goto yy44; yy374: YYDEBUG(374, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy453; - if (yych == 'i') goto yy453; - goto yy128; + if (yych == 'T') goto yy464; + if (yych == 't') goto yy464; + goto yy44; yy375: YYDEBUG(375, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'U') { - if (yych == 'I') goto yy454; - if (yych <= 'T') goto yy128; - goto yy455; - } else { - if (yych <= 'i') { - if (yych <= 'h') goto yy128; - goto yy454; - } else { - if (yych == 'u') goto yy455; - goto yy128; - } - } + if (yych == 'M') goto yy465; + if (yych == 'm') goto yy465; + goto yy44; yy376: YYDEBUG(376, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy456; - if (yych == 'a') goto yy456; - goto yy128; + if (yych == 'A') goto yy466; + if (yych == 'a') goto yy466; + goto yy44; yy377: YYDEBUG(377, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy457; - if (yych == 'i') goto yy457; - goto yy128; + if (yych == 'Y') goto yy467; + if (yych == 'y') goto yy467; + goto yy82; yy378: YYDEBUG(378, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy458; - if (yych == 'e') goto yy458; - goto yy128; + if (yych == 'R') goto yy469; + if (yych == 'r') goto yy469; + goto yy82; yy379: YYDEBUG(379, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy459; - if (yych == 'a') goto yy459; - goto yy128; + if (yych == 'E') goto yy474; + if (yych == 'e') goto yy474; + goto yy471; yy380: YYDEBUG(380, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy460; - if (yych == 'r') goto yy460; - goto yy128; + if (yych == 'L') goto yy475; + if (yych == 'l') goto yy475; + goto yy82; yy381: YYDEBUG(381, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy461; - if (yych == 'a') goto yy461; - goto yy166; + if (yych == 'T') goto yy388; + if (yych == 't') goto yy388; + goto yy82; yy382: YYDEBUG(382, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy462; - if (yych == 'a') goto yy462; - goto yy166; + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; yy383: YYDEBUG(383, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy463; - if (yych == 'l') goto yy463; - goto yy166; -yy384: + if (yych <= 0x1F) { + if (yych == '\t') goto yy382; + goto yy82; + } else { + if (yych <= ' ') goto yy382; + if (yych != ')') goto yy82; + } YYDEBUG(384, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'B') goto yy464; - if (yych == 'b') goto yy464; - goto yy166; -yy385: + ++YYCURSOR; YYDEBUG(385, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy465; - if (yych == 'a') goto yy465; - goto yy166; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1456 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_INT_CAST); +} +#line 4540 "Zend/zend_language_scanner.c" yy386: YYDEBUG(386, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy470; - if (yych == 'e') goto yy470; - goto yy467; + if (yych == 'G') goto yy476; + if (yych == 'g') goto yy476; + goto yy82; yy387: YYDEBUG(387, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy471; - if (yych == 'e') goto yy471; - goto yy166; + if (yych == 'C') goto yy477; + if (yych == 'c') goto yy477; + goto yy82; yy388: YYDEBUG(388, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy472; - if (yych == 'l') goto yy472; - goto yy166; -yy389: + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; YYDEBUG(389, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'I') goto yy474; - if (yych == 'i') goto yy474; - goto yy166; + 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 == 'E') goto yy475; - if (yych == 'e') goto yy475; - goto yy166; + 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(1); + YYFILL(3); yych = *YYCURSOR; - YYDEBUG(392, *YYCURSOR); - if (yych <= '\f') { - if (yych <= 0x08) goto yy197; - if (yych <= '\n') goto yy391; - goto yy197; - } else { - if (yych <= '\r') goto yy391; - if (yych == ' ') goto yy391; - goto yy197; - } yy393: YYDEBUG(393, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '"') goto yy166; - if (yych <= '/') goto yy477; - if (yych <= '9') goto yy166; - goto yy477; + 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); - yych = *++YYCURSOR; - if (yych == '\'') goto yy166; - if (yych <= '/') goto yy479; - if (yych <= '9') goto yy166; - goto yy479; -yy395: - YYDEBUG(395, *YYCURSOR); ++YYCURSOR; - YYFILL(2); + YYFILL(3); yych = *YYCURSOR; - YYDEBUG(396, *YYCURSOR); - if (yych <= '@') { - if (yych <= '\f') { - if (yych == '\n') goto yy480; - goto yy166; +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 <= '\r') goto yy482; - if (yych <= '/') goto yy166; - if (yych <= '9') goto yy395; - goto yy166; + 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 2249 "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_START(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); + } + + 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; + int heredoc_nesting_level = 1; + int first_token = 0; + + zend_save_lexical_state(¤t_state); + + SCNG(heredoc_scan_ahead) = 1; + SCNG(heredoc_indentation) = 0; + SCNG(heredoc_indentation_uses_spaces) = 0; + LANG_SCNG(on_event) = NULL; + + zend_ptr_stack_reverse_apply(¤t_state.heredoc_label_stack, copy_heredoc_label_stack); + + while (heredoc_nesting_level) { + zval zv; + int retval; + + ZVAL_UNDEF(&zv); + retval = lex_scan(&zv, NULL); + zval_dtor(&zv); + + if (EG(exception)) { + zend_clear_exception(); + break; } - } else { - if (yych <= '_') { - if (yych <= 'Z') goto yy395; - if (yych <= '^') goto yy166; - goto yy395; - } else { - if (yych <= '`') goto yy166; - if (yych <= 'z') goto yy395; - if (yych <= 0x7F) goto yy166; - goto yy395; + + 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; } } -yy397: - YYDEBUG(397, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy483; - if (yych == 'r') goto yy483; - goto yy128; + + if ( + (first_token == T_VARIABLE + || first_token == T_DOLLAR_OPEN_CURLY_BRACES + || first_token == T_CURLY_OPEN + ) && SCNG(heredoc_indentation)) { + zend_throw_exception_ex(zend_ce_parse_error, 0, "Invalid body indentation level (expecting an indentation level of at least %d)", SCNG(heredoc_indentation)); + } + + heredoc_label->indentation = SCNG(heredoc_indentation); + heredoc_label->indentation_uses_spaces = SCNG(heredoc_indentation_uses_spaces); + + zend_restore_lexical_state(¤t_state); + SCNG(heredoc_scan_ahead) = 0; + CG(increment_lineno) = 0; + } + + RETURN_TOKEN(T_START_HEREDOC); +} +#line 4767 "Zend/zend_language_scanner.c" yy398: YYDEBUG(398, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy484; - if (yych == 'y') goto yy484; - goto yy128; + if (yych == '\n') goto yy396; + goto yy397; yy399: YYDEBUG(399, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'K') goto yy486; - if (yych == 'k') goto yy486; - goto yy128; + if (yych == 'A') goto yy484; + if (yych == 'a') goto yy484; + goto yy44; yy400: YYDEBUG(400, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy488; - if (yych == 'a') goto yy488; - goto yy128; -yy401: - YYDEBUG(401, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(402, *YYCURSOR); + YYDEBUG(401, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1356 "Zend/zend_language_scanner.l" +#line 1568 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_CASE); + RETURN_TOKEN(T_ARRAY); } -#line 5003 "Zend/zend_language_scanner.c" -yy403: - YYDEBUG(403, *YYCURSOR); +#line 4791 "Zend/zend_language_scanner.c" +yy402: + YYDEBUG(402, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy489; - if (yych == 'h') goto yy489; - goto yy128; + if (yybm[0+yych] & 16) { + goto yy43; + } + YYDEBUG(403, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1364 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_BREAK); +} +#line 4804 "Zend/zend_language_scanner.c" yy404: YYDEBUG(404, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy491; - if (yych == 's') goto yy491; - goto yy128; + if (yych == 'B') goto yy485; + if (yych == 'b') goto yy485; + goto yy44; yy405: YYDEBUG(405, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy493; - if (yych == 'e') goto yy493; - goto yy128; -yy406: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(406, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy495; - if (yych == 't') goto yy495; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1276 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_CATCH); +} +#line 4823 "Zend/zend_language_scanner.c" yy407: YYDEBUG(407, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy497; - if (yych == 'i') goto yy497; - goto yy128; -yy408: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(408, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy498; - if (yych == 'a') goto yy498; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1384 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_CLASS); +} +#line 4836 "Zend/zend_language_scanner.c" yy409: YYDEBUG(409, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy499; - if (yych == 'u') goto yy499; - goto yy128; -yy410: - YYDEBUG(410, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(411, *YYCURSOR); + YYDEBUG(410, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1376 "Zend/zend_language_scanner.l" +#line 1448 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_ECHO); + RETURN_TOKEN(T_CLONE); } -#line 5058 "Zend/zend_language_scanner.c" -yy412: - YYDEBUG(412, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '^') { - if (yych <= '@') { - if (yych <= '/') goto yy413; - if (yych <= '9') goto yy127; - } else { - if (yych == 'I') goto yy500; - if (yych <= 'Z') goto yy127; - } - } else { - if (yych <= 'h') { - if (yych != '`') goto yy127; - } else { - if (yych <= 'i') goto yy500; - if (yych <= 'z') goto yy127; - if (yych >= 0x80) goto yy127; - } +#line 4849 "Zend/zend_language_scanner.c" +yy411: + YYDEBUG(411, *YYCURSOR); + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } -yy413: - YYDEBUG(413, *YYCURSOR); + YYDEBUG(412, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1300 "Zend/zend_language_scanner.l" +#line 1254 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_ELSE); + RETURN_TOKEN(T_CONST); } -#line 5086 "Zend/zend_language_scanner.c" +#line 4862 "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 == 'Y') goto yy501; - if (yych == 'y') goto yy501; - goto yy128; + if (yych == 'R') goto yy487; + if (yych == 'r') goto yy487; + goto yy44; yy415: YYDEBUG(415, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy503; - if (yych == 'e') goto yy503; - goto yy128; + if (yych == 'L') goto yy488; + if (yych == 'l') goto yy488; + goto yy44; yy416: YYDEBUG(416, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy504; - if (yych == 'o') goto yy504; - goto yy128; + if (yych == 'F') goto yy489; + if (yych == 'f') goto yy489; + goto yy44; yy417: YYDEBUG(417, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy505; - if (yych == 'f') goto yy505; - goto yy128; -yy418: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(418, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'W') goto yy507; - if (yych == 'w') goto yy507; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1524 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_EMPTY); +} +#line 4899 "Zend/zend_language_scanner.c" yy419: YYDEBUG(419, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy508; - if (yych == 'h') goto yy508; - goto yy128; + if (yych == 'C') goto yy491; + if (yych == 'c') goto yy491; + goto yy44; yy420: YYDEBUG(420, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'R') goto yy492; + if (yych == 'r') goto yy492; + goto yy44; +yy421: YYDEBUG(421, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1484 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_EVAL); -} -#line 5135 "Zend/zend_language_scanner.c" -yy422: - YYDEBUG(422, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(423, *YYCURSOR); + YYDEBUG(422, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1242 "Zend/zend_language_scanner.l" +#line 1296 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_EXIT); + RETURN_TOKEN(T_ENDIF); } -#line 5148 "Zend/zend_language_scanner.c" +#line 4924 "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 == 'N') goto yy509; - if (yych == 'n') goto yy509; - goto yy128; + if (yych == 'I') goto yy495; + if (yych == 'i') goto yy495; + goto yy44; yy425: YYDEBUG(425, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy510; - if (yych == 'l') goto yy510; - goto yy128; + if (yych == 'D') goto yy496; + if (yych == 'd') goto yy496; + goto yy44; yy426: YYDEBUG(426, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy512; - if (yych == 'a') goto yy512; - goto yy128; + 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); - yych = *++YYCURSOR; - if (yych == 'T') goto yy513; - if (yych == 't') goto yy513; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1540 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_FINAL); +} +#line 4970 "Zend/zend_language_scanner.c" yy428: YYDEBUG(428, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy514; - if (yych == 'a') goto yy514; - goto yy128; + if (yych == 'C') goto yy498; + if (yych == 'c') goto yy498; + goto yy44; yy429: YYDEBUG(429, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'I') goto yy499; + if (yych == 'i') goto yy499; + goto yy44; +yy430: YYDEBUG(430, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1372 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_GOTO); -} -#line 5191 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'L') goto yy500; + if (yych == 'l') goto yy500; + goto yy44; yy431: YYDEBUG(431, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy515; - if (yych == 'e') goto yy515; - goto yy128; + if (yych == 'M') goto yy502; + if (yych == 'm') goto yy502; + goto yy44; yy432: YYDEBUG(432, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy516; - if (yych == 'u') goto yy516; - goto yy128; + if (yych == 'D') goto yy503; + if (yych == 'd') goto yy503; + goto yy44; yy433: YYDEBUG(433, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'E') { - if (yych == 'A') goto yy517; - if (yych <= 'D') goto yy128; - goto yy518; - } else { - if (yych <= 'a') { - if (yych <= '`') goto yy128; - goto yy517; - } else { - if (yych == 'e') goto yy518; - goto yy128; - } - } + if (yych == 'N') goto yy504; + if (yych == 'n') goto yy504; + goto yy44; yy434: YYDEBUG(434, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy519; - if (yych == 'r') goto yy519; - goto yy128; + if (yych == 'A') goto yy505; + if (yych == 'a') goto yy505; + goto yy44; yy435: YYDEBUG(435, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy520; - if (yych == 't') goto yy520; - goto yy128; + if (yych == 'F') goto yy506; + if (yych == 'f') goto yy506; + goto yy44; yy436: YYDEBUG(436, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } YYDEBUG(437, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1564 "Zend/zend_language_scanner.l" +#line 1520 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_LIST); + RETURN_TOKEN(T_ISSET); } -#line 5244 "Zend/zend_language_scanner.c" +#line 5031 "Zend/zend_language_scanner.c" yy438: YYDEBUG(438, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy522; - if (yych == 's') goto yy522; - goto yy128; + if (yych == 'P') goto yy507; + if (yych == 'p') goto yy507; + goto yy44; yy439: YYDEBUG(439, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy523; - if (yych == 't') goto yy523; - goto yy128; -yy440: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(440, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy525; - if (yych == 'a') goto yy525; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1380 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_PRINT); +} +#line 5050 "Zend/zend_language_scanner.c" yy441: YYDEBUG(441, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy526; - if (yych == 'e') goto yy526; - goto yy128; + if (yych == 'T') goto yy508; + if (yych == 't') goto yy508; + goto yy44; yy442: YYDEBUG(442, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy527; - if (yych == 'i') goto yy527; - goto yy128; + if (yych == 'C') goto yy509; + if (yych == 'c') goto yy509; + goto yy44; yy443: YYDEBUG(443, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy528; - if (yych == 'i') goto yy528; - goto yy128; + if (yych == 'C') goto yy510; + if (yych == 'c') goto yy510; + goto yy44; yy444: YYDEBUG(444, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy529; - if (yych == 'r') goto yy529; - goto yy128; + if (yych == 'R') goto yy512; + if (yych == 'r') goto yy512; + goto yy44; yy445: YYDEBUG(445, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy530; - if (yych == 'i') goto yy530; - goto yy128; + if (yych == 'N') goto yy513; + if (yych == 'n') goto yy513; + goto yy44; yy446: YYDEBUG(446, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy531; - if (yych == 'c') goto yy531; - goto yy128; + if (yych == 'C') goto yy515; + if (yych == 'c') goto yy515; + goto yy44; yy447: YYDEBUG(447, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'W') goto yy532; - if (yych == 'w') goto yy532; - goto yy128; + if (yych == 'H') goto yy517; + if (yych == 'h') goto yy517; + goto yy44; yy448: YYDEBUG(448, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy534; - if (yych == 't') goto yy534; - goto yy128; -yy449: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(449, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy536; - if (yych == 't') goto yy536; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1284 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_THROW); +} +#line 5105 "Zend/zend_language_scanner.c" yy450: YYDEBUG(450, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy538; - if (yych == 'e') goto yy538; - goto yy128; -yy451: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(451, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'D') goto yy540; - if (yych == 'd') goto yy540; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1392 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_TRAIT); +} +#line 5118 "Zend/zend_language_scanner.c" yy452: YYDEBUG(452, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy542; - if (yych == 'a') goto yy542; - goto yy128; -yy453: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(453, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy543; - if (yych == 'r') goto yy543; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1556 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_UNSET); +} +#line 5131 "Zend/zend_language_scanner.c" yy454: YYDEBUG(454, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy544; - if (yych == 'l') goto yy544; - goto yy128; -yy455: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(455, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'N') goto yy545; - if (yych == 'n') goto yy545; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1304 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_WHILE); +} +#line 5144 "Zend/zend_language_scanner.c" yy456: YYDEBUG(456, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy546; - if (yych == 'l') goto yy546; - goto yy128; + 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); - yych = *++YYCURSOR; - if (yych == 'N') goto yy547; - if (yych == 'n') goto yy547; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1268 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_YIELD); +} +#line 5166 "Zend/zend_language_scanner.c" yy458: YYDEBUG(458, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy548; - if (yych == 't') goto yy548; - goto yy128; + if (yych == 'S') goto yy521; + if (yych == 's') goto yy521; + goto yy44; yy459: YYDEBUG(459, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy549; - if (yych == 'm') goto yy549; - goto yy128; + if (yych == '_') goto yy522; + goto yy44; yy460: YYDEBUG(460, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy550; - if (yych == 'a') goto yy550; - goto yy128; + if (yych == 'E') goto yy523; + if (yych == 'e') goto yy523; + goto yy44; yy461: YYDEBUG(461, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy551; - if (yych == 'y') goto yy551; - goto yy166; + if (yych == 'C') goto yy524; + if (yych == 'c') goto yy524; + goto yy44; yy462: YYDEBUG(462, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy553; - if (yych == 'r') goto yy553; - goto yy166; + if (yych == 'T') goto yy525; + if (yych == 't') goto yy525; + goto yy44; yy463: YYDEBUG(463, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy558; - if (yych == 'e') goto yy558; - goto yy555; + if (yych == 'E') goto yy526; + if (yych == 'e') goto yy526; + goto yy44; yy464: YYDEBUG(464, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy559; - if (yych == 'l') goto yy559; - goto yy166; + if (yych == 'H') goto yy527; + if (yych == 'h') goto yy527; + goto yy44; yy465: YYDEBUG(465, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy472; - if (yych == 't') goto yy472; - goto yy166; + 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; -yy467: - YYDEBUG(467, *YYCURSOR); + YYDEBUG(468, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy466; - goto yy166; + if (yych == '\t') goto yy467; + goto yy82; } else { - if (yych <= ' ') goto yy466; - if (yych != ')') goto yy166; + if (yych <= ' ') goto yy467; + if (yych == ')') goto yy530; + goto yy82; } - YYDEBUG(468, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(469, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1456 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_INT_CAST); -} -#line 5435 "Zend/zend_language_scanner.c" -yy470: - YYDEBUG(470, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'G') goto yy560; - if (yych == 'g') goto yy560; - goto yy166; -yy471: - YYDEBUG(471, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy561; - if (yych == 'c') goto yy561; - goto yy166; -yy472: - YYDEBUG(472, *YYCURSOR); +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; - YYDEBUG(473, *YYCURSOR); +yy471: + YYDEBUG(471, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy472; - goto yy166; + if (yych == '\t') goto yy470; + goto yy82; } else { - if (yych <= ' ') goto yy472; - if (yych == ')') goto yy562; - goto yy166; + if (yych <= ' ') goto yy470; + if (yych != ')') goto yy82; } + YYDEBUG(472, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(473, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1476 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_BOOL_CAST); +} +#line 5262 "Zend/zend_language_scanner.c" yy474: YYDEBUG(474, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy564; - if (yych == 'n') goto yy564; - goto yy166; + if (yych == 'A') goto yy534; + if (yych == 'a') goto yy534; + goto yy82; yy475: YYDEBUG(475, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy565; - if (yych == 't') goto yy565; - goto yy166; + if (yych == 'E') goto yy388; + if (yych == 'e') goto yy388; + goto yy82; yy476: YYDEBUG(476, *YYCURSOR); - ++YYCURSOR; - YYFILL(3); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'E') goto yy535; + if (yych == 'e') goto yy535; + goto yy82; yy477: YYDEBUG(477, *YYCURSOR); - if (yych <= 'Z') { - if (yych <= '/') { - if (yych == '"') goto yy567; - goto yy166; - } else { - if (yych <= '9') goto yy476; - if (yych <= '@') goto yy166; - goto yy476; - } - } else { - if (yych <= '`') { - if (yych == '_') goto yy476; - goto yy166; - } else { - if (yych <= 'z') goto yy476; - if (yych <= 0x7F) goto yy166; - goto yy476; - } - } + yych = *++YYCURSOR; + if (yych == 'T') goto yy536; + if (yych == 't') goto yy536; + goto yy82; yy478: YYDEBUG(478, *YYCURSOR); ++YYCURSOR; - YYFILL(3); - yych = *YYCURSOR; -yy479: YYDEBUG(479, *YYCURSOR); - if (yych <= 'Z') { - if (yych <= '/') { - if (yych == '\'') goto yy567; - goto yy166; - } else { - if (yych <= '9') goto yy478; - if (yych <= '@') goto yy166; - goto yy478; - } - } else { - if (yych <= '`') { - if (yych == '_') goto yy478; - goto yy166; - } else { - if (yych <= 'z') goto yy478; - if (yych <= 0x7F) goto yy166; - goto yy478; - } - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 1460 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_DOUBLE_CAST); +} +#line 5296 "Zend/zend_language_scanner.c" yy480: YYDEBUG(480, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'G') goto yy532; + if (yych == 'g') goto yy532; + goto yy82; yy481: YYDEBUG(481, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2249 "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_START(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); - } - - 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; - int heredoc_nesting_level = 1; - int first_token = 0; - - zend_save_lexical_state(¤t_state); - - SCNG(heredoc_scan_ahead) = 1; - SCNG(heredoc_indentation) = 0; - SCNG(heredoc_indentation_uses_spaces) = 0; - LANG_SCNG(on_event) = NULL; - - zend_ptr_stack_reverse_apply(¤t_state.heredoc_label_stack, copy_heredoc_label_stack); - - while (heredoc_nesting_level) { - zval zv; - int retval; - - ZVAL_UNDEF(&zv); - retval = lex_scan(&zv, NULL); - zval_dtor(&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; - } - } - - if ( - (first_token == T_VARIABLE - || first_token == T_DOLLAR_OPEN_CURLY_BRACES - || first_token == T_CURLY_OPEN - ) && SCNG(heredoc_indentation)) { - zend_throw_exception_ex(zend_ce_parse_error, 0, "Invalid body indentation level (expecting an indentation level of at least %d)", SCNG(heredoc_indentation)); - } - - heredoc_label->indentation = SCNG(heredoc_indentation); - heredoc_label->indentation_uses_spaces = SCNG(heredoc_indentation_uses_spaces); - - zend_restore_lexical_state(¤t_state); - SCNG(heredoc_scan_ahead) = 0; - CG(increment_lineno) = 0; - } - - RETURN_TOKEN(T_START_HEREDOC); -} -#line 5662 "Zend/zend_language_scanner.c" -yy482: + YYFILL(1); + yych = *YYCURSOR; YYDEBUG(482, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy480; - goto yy481; + 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 == 'A') goto yy568; - if (yych == 'a') goto yy568; - goto yy128; + if (yych == '\n') goto yy396; + if (yych == '\r') goto yy398; + goto yy82; yy484: YYDEBUG(484, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'C') goto yy540; + if (yych == 'c') goto yy540; + goto yy44; +yy485: YYDEBUG(485, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1568 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_ARRAY); -} -#line 5686 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'L') goto yy541; + if (yych == 'l') goto yy541; + goto yy44; yy486: YYDEBUG(486, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'U') goto yy542; + if (yych == 'u') goto yy542; + goto yy44; +yy487: YYDEBUG(487, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1364 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_BREAK); -} -#line 5699 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'E') goto yy543; + if (yych == 'e') goto yy543; + goto yy44; yy488: YYDEBUG(488, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy569; - if (yych == 'b') goto yy569; - goto yy128; + if (yych == 'T') goto yy545; + if (yych == 't') goto yy545; + goto yy44; yy489: YYDEBUG(489, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } YYDEBUG(490, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1276 "Zend/zend_language_scanner.l" +#line 1292 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_CATCH); + RETURN_TOKEN(T_ELSEIF); } -#line 5718 "Zend/zend_language_scanner.c" +#line 5365 "Zend/zend_language_scanner.c" yy491: YYDEBUG(491, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'L') goto yy547; + if (yych == 'l') goto yy547; + goto yy44; +yy492: YYDEBUG(492, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1384 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_CLASS); -} -#line 5731 "Zend/zend_language_scanner.c" + 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); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(494, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1448 "Zend/zend_language_scanner.l" +#line 1320 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_CLONE); + RETURN_TOKEN(T_ENDFOR); } -#line 5744 "Zend/zend_language_scanner.c" +#line 5399 "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); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'L') goto yy550; + if (yych == 'l') goto yy550; + goto yy44; +yy496: YYDEBUG(496, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1254 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_CONST); -} -#line 5757 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'S') goto yy551; + if (yych == 's') goto yy551; + goto yy44; yy497: YYDEBUG(497, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy570; - if (yych == 'n') goto yy570; - goto yy128; + if (yych == 'Y') goto yy553; + if (yych == 'y') goto yy553; + goto yy44; yy498: YYDEBUG(498, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy571; - if (yych == 'r') goto yy571; - goto yy128; + if (yych == 'H') goto yy555; + if (yych == 'h') goto yy555; + goto yy44; yy499: YYDEBUG(499, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy572; - if (yych == 'l') goto yy572; - goto yy128; + if (yych == 'O') goto yy557; + if (yych == 'o') goto yy557; + goto yy44; yy500: YYDEBUG(500, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy573; - if (yych == 'f') goto yy573; - goto yy128; -yy501: - YYDEBUG(501, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(502, *YYCURSOR); + YYDEBUG(501, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1524 "Zend/zend_language_scanner.l" +#line 1516 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_EMPTY); + RETURN_TOKEN(T_GLOBAL); } -#line 5794 "Zend/zend_language_scanner.c" +#line 5448 "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 == 'C') goto yy575; - if (yych == 'c') goto yy575; - goto yy128; + if (yych == 'E') goto yy559; + if (yych == 'e') goto yy559; + goto yy44; yy504: YYDEBUG(504, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy576; - if (yych == 'r') goto yy576; - goto yy128; + if (yych == 'C') goto yy561; + if (yych == 'c') goto yy561; + goto yy44; yy505: YYDEBUG(505, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'D') goto yy562; + if (yych == 'd') goto yy562; + goto yy44; +yy506: YYDEBUG(506, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1296 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_ENDIF); -} -#line 5819 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'A') goto yy563; + if (yych == 'a') goto yy563; + goto yy44; yy507: YYDEBUG(507, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy578; - if (yych == 'i') goto yy578; - goto yy128; + if (yych == 'A') goto yy564; + if (yych == 'a') goto yy564; + goto yy44; yy508: YYDEBUG(508, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy579; - if (yych == 'i') goto yy579; - goto yy128; + if (yych == 'E') goto yy565; + if (yych == 'e') goto yy565; + goto yy44; yy509: YYDEBUG(509, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy580; - if (yych == 'd') goto yy580; - goto yy128; + if (yych == 'T') goto yy567; + if (yych == 't') goto yy567; + goto yy44; yy510: YYDEBUG(510, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '^') { - if (yych <= '@') { - if (yych <= '/') goto yy511; - if (yych <= '9') goto yy127; - } else { - if (yych == 'L') goto yy581; - if (yych <= 'Z') goto yy127; - } - } else { - if (yych <= 'k') { - if (yych != '`') goto yy127; - } else { - if (yych <= 'l') goto yy581; - if (yych <= 'z') goto yy127; - if (yych >= 0x80) goto yy127; - } + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } -yy511: YYDEBUG(511, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1540 "Zend/zend_language_scanner.l" +#line 1552 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_FINAL); + RETURN_TOKEN(T_PUBLIC); } -#line 5865 "Zend/zend_language_scanner.c" +#line 5509 "Zend/zend_language_scanner.c" yy512: YYDEBUG(512, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy582; - if (yych == 'c') goto yy582; - goto yy128; + if (yych == 'E') goto yy568; + if (yych == 'e') goto yy568; + goto yy44; yy513: YYDEBUG(513, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy583; - if (yych == 'i') goto yy583; - goto yy128; -yy514: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(514, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy584; - if (yych == 'l') goto yy584; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1258 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_RETURN); +} +#line 5528 "Zend/zend_language_scanner.c" yy515: YYDEBUG(515, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy586; - if (yych == 'm') goto yy586; - goto yy128; -yy516: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(516, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'D') goto yy587; - if (yych == 'd') goto yy587; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1532 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_STATIC); +} +#line 5541 "Zend/zend_language_scanner.c" yy517: YYDEBUG(517, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy588; - if (yych == 'n') goto yy588; - goto yy128; -yy518: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(518, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy589; - if (yych == 'a') goto yy589; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1348 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_SWITCH); +} +#line 5554 "Zend/zend_language_scanner.c" yy519: YYDEBUG(519, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'F') goto yy590; - if (yych == 'f') goto yy590; - goto yy128; -yy520: - YYDEBUG(520, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + 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); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1520 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_ISSET); -} -#line 5926 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'S') goto yy571; + if (yych == 's') goto yy571; + goto yy44; yy522: YYDEBUG(522, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy591; - if (yych == 'p') goto yy591; - goto yy128; + if (yych == '_') goto yy572; + goto yy44; yy523: YYDEBUG(523, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == '_') goto yy574; + goto yy44; +yy524: YYDEBUG(524, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1380 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_PRINT); -} -#line 5945 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'T') goto yy575; + if (yych == 't') goto yy575; + goto yy44; yy525: YYDEBUG(525, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy592; - if (yych == 't') goto yy592; - goto yy128; + if (yych == '_') goto yy576; + goto yy44; yy526: YYDEBUG(526, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy593; - if (yych == 'c') goto yy593; - goto yy128; + if (yych == '_') goto yy577; + goto yy44; yy527: YYDEBUG(527, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy594; - if (yych == 'c') goto yy594; - goto yy128; + if (yych == 'O') goto yy578; + if (yych == 'o') goto yy578; + goto yy44; yy528: YYDEBUG(528, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy596; - if (yych == 'r') goto yy596; - goto yy128; + if (yych == 'S') goto yy579; + if (yych == 's') goto yy579; + goto yy44; yy529: YYDEBUG(529, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy597; - if (yych == 'n') goto yy597; - goto yy128; + if (yych == 'T') goto yy580; + if (yych == 't') goto yy580; + goto yy44; yy530: YYDEBUG(530, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy599; - if (yych == 'c') goto yy599; - goto yy128; -yy531: + ++YYCURSOR; YYDEBUG(531, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'H') goto yy601; - if (yych == 'h') goto yy601; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1468 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_ARRAY_CAST); +} +#line 5638 "Zend/zend_language_scanner.c" yy532: YYDEBUG(532, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + YYFILL(1); + yych = *YYCURSOR; YYDEBUG(533, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1284 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_THROW); -} -#line 6000 "Zend/zend_language_scanner.c" + 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); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'N') goto yy470; + if (yych == 'n') goto yy470; + goto yy82; +yy535: YYDEBUG(535, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1392 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_TRAIT); -} -#line 6013 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'R') goto yy382; + if (yych == 'r') goto yy382; + goto yy82; yy536: YYDEBUG(536, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + YYFILL(1); + yych = *YYCURSOR; YYDEBUG(537, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1556 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_UNSET); -} -#line 6026 "Zend/zend_language_scanner.c" + 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; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } YYDEBUG(539, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1304 "Zend/zend_language_scanner.l" +#line 1480 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_WHILE); + RETURN_TOKEN(T_UNSET_CAST); } -#line 6039 "Zend/zend_language_scanner.c" +#line 5688 "Zend/zend_language_scanner.c" yy540: YYDEBUG(540, *YYCURSOR); - yyaccept = 6; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 16) { - goto yy127; - } - if (yych <= '\f') { - if (yych <= 0x08) goto yy541; - if (yych <= '\n') goto yy603; - } else { - if (yych <= '\r') goto yy603; - if (yych == ' ') goto yy603; - } + yych = *++YYCURSOR; + if (yych == 'T') goto yy585; + if (yych == 't') goto yy585; + goto yy44; yy541: YYDEBUG(541, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1268 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_YIELD); -} -#line 6061 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'E') goto yy587; + if (yych == 'e') goto yy587; + goto yy44; yy542: YYDEBUG(542, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy605; - if (yych == 's') goto yy605; - goto yy128; + if (yych == 'E') goto yy589; + if (yych == 'e') goto yy589; + goto yy44; yy543: YYDEBUG(543, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy606; - goto yy128; -yy544: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(544, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy607; - if (yych == 'e') goto yy607; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1332 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_DECLARE); +} +#line 5719 "Zend/zend_language_scanner.c" yy545: YYDEBUG(545, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy608; - if (yych == 'c') goto yy608; - goto yy128; -yy546: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(546, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy609; - if (yych == 't') goto yy609; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1360 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_DEFAULT); +} +#line 5732 "Zend/zend_language_scanner.c" yy547: YYDEBUG(547, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy610; - if (yych == 'e') goto yy610; - goto yy128; + if (yych == 'A') goto yy591; + if (yych == 'a') goto yy591; + goto yy44; yy548: YYDEBUG(548, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy611; - if (yych == 'h') goto yy611; - goto yy128; + if (yych == 'A') goto yy592; + if (yych == 'a') goto yy592; + goto yy44; yy549: YYDEBUG(549, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy612; - if (yych == 'e') goto yy612; - goto yy128; + if (yych == 'C') goto yy593; + if (yych == 'c') goto yy593; + goto yy44; yy550: YYDEBUG(550, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy613; - if (yych == 'i') goto yy613; - goto yy128; + if (yych == 'E') goto yy594; + if (yych == 'e') goto yy594; + goto yy44; yy551: YYDEBUG(551, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(552, *YYCURSOR); - if (yych <= 0x1F) { - if (yych == '\t') goto yy551; - goto yy166; - } else { - if (yych <= ' ') goto yy551; - if (yych == ')') goto yy614; - goto yy166; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } + YYDEBUG(552, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1396 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_EXTENDS); +} +#line 5769 "Zend/zend_language_scanner.c" yy553: YYDEBUG(553, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy616; - if (yych == 'y') goto yy616; - goto yy166; -yy554: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(554, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1280 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_FINALLY); +} +#line 5782 "Zend/zend_language_scanner.c" yy555: YYDEBUG(555, *YYCURSOR); - if (yych <= 0x1F) { - if (yych == '\t') goto yy554; - goto yy166; - } else { - if (yych <= ' ') goto yy554; - if (yych != ')') goto yy166; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } YYDEBUG(556, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(557, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1476 "Zend/zend_language_scanner.l" +#line 1324 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_BOOL_CAST); + RETURN_TOKEN(T_FOREACH); } -#line 6157 "Zend/zend_language_scanner.c" +#line 5795 "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 == 'A') goto yy618; - if (yych == 'a') goto yy618; - goto yy166; + if (yych == 'N') goto yy598; + if (yych == 'n') goto yy598; + goto yy44; yy559: YYDEBUG(559, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy472; - if (yych == 'e') goto yy472; - goto yy166; + 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); - yych = *++YYCURSOR; - if (yych == 'E') goto yy619; - if (yych == 'e') goto yy619; - goto yy166; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1488 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_INCLUDE); +} +#line 5833 "Zend/zend_language_scanner.c" yy561: YYDEBUG(561, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy620; - if (yych == 't') goto yy620; - goto yy166; + if (yych == 'E') goto yy600; + if (yych == 'e') goto yy600; + goto yy44; yy562: YYDEBUG(562, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'O') goto yy601; + if (yych == 'o') goto yy601; + goto yy44; +yy563: YYDEBUG(563, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1460 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_DOUBLE_CAST); -} -#line 6191 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'C') goto yy602; + if (yych == 'c') goto yy602; + goto yy44; yy564: YYDEBUG(564, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'G') goto yy616; - if (yych == 'g') goto yy616; - goto yy166; + if (yych == 'C') goto yy603; + if (yych == 'c') goto yy603; + goto yy44; yy565: YYDEBUG(565, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(566, *YYCURSOR); - if (yych <= 0x1F) { - if (yych == '\t') goto yy565; - goto yy166; - } else { - if (yych <= ' ') goto yy565; - if (yych == ')') goto yy622; - goto yy166; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } + YYDEBUG(566, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1544 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_PRIVATE); +} +#line 5870 "Zend/zend_language_scanner.c" yy567: YYDEBUG(567, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy480; - if (yych == '\r') goto yy482; - goto yy166; + if (yych == 'E') goto yy604; + if (yych == 'e') goto yy604; + goto yy44; yy568: YYDEBUG(568, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy624; - if (yych == 'c') goto yy624; - goto yy128; + 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); - yych = *++YYCURSOR; - if (yych == 'L') goto yy625; - if (yych == 'l') goto yy625; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1496 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_REQUIRE); +} +#line 5902 "Zend/zend_language_scanner.c" yy570: YYDEBUG(570, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy626; - if (yych == 'u') goto yy626; - goto yy128; + if (yych == 'R') goto yy606; + if (yych == 'r') goto yy606; + goto yy82; yy571: YYDEBUG(571, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy627; - if (yych == 'e') goto yy627; - goto yy128; + if (yych == '_') goto yy607; + goto yy44; yy572: YYDEBUG(572, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy629; - if (yych == 't') goto yy629; - goto yy128; -yy573: - YYDEBUG(573, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(574, *YYCURSOR); + YYDEBUG(573, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1292 "Zend/zend_language_scanner.l" +#line 1898 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_ELSEIF); + RETURN_TOKEN(T_DIR); } -#line 6260 "Zend/zend_language_scanner.c" +#line 5926 "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 == 'L') goto yy631; - if (yych == 'l') goto yy631; - goto yy128; + if (yych == 'I') goto yy610; + if (yych == 'i') goto yy610; + goto yy44; yy576: YYDEBUG(576, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '^') { - if (yych <= '@') { - if (yych <= '/') goto yy577; - if (yych <= '9') goto yy127; - } else { - if (yych == 'E') goto yy632; - if (yych <= 'Z') goto yy127; - } - } else { - if (yych <= 'd') { - if (yych != '`') goto yy127; - } else { - if (yych <= 'e') goto yy632; - if (yych <= 'z') goto yy127; - if (yych >= 0x80) goto yy127; - } - } + yych = *++YYCURSOR; + if (yych == 'C') goto yy611; + if (yych == 'c') goto yy611; + goto yy44; yy577: YYDEBUG(577, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1320 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_ENDFOR); -} -#line 6294 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == '_') goto yy612; + goto yy44; yy578: YYDEBUG(578, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy633; - if (yych == 't') goto yy633; - goto yy128; + if (yych == 'D') goto yy614; + if (yych == 'd') goto yy614; + goto yy44; yy579: YYDEBUG(579, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy634; - if (yych == 'l') goto yy634; - goto yy128; + if (yych == 'P') goto yy615; + if (yych == 'p') goto yy615; + goto yy44; yy580: YYDEBUG(580, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy635; - if (yych == 's') goto yy635; - goto yy128; + if (yych == '_') goto yy616; + goto yy44; yy581: YYDEBUG(581, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'Y') goto yy637; - if (yych == 'y') goto yy637; - goto yy128; -yy582: + ++YYCURSOR; YYDEBUG(582, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'H') goto yy639; - if (yych == 'h') goto yy639; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1464 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_STRING_CAST); +} +#line 5975 "Zend/zend_language_scanner.c" yy583: YYDEBUG(583, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'O') goto yy641; - if (yych == 'o') goto yy641; - goto yy128; -yy584: - YYDEBUG(584, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(585, *YYCURSOR); + YYDEBUG(584, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1516 "Zend/zend_language_scanner.l" +#line 1472 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_GLOBAL); + RETURN_TOKEN(T_OBJECT_CAST); } -#line 6343 "Zend/zend_language_scanner.c" -yy586: - YYDEBUG(586, *YYCURSOR); +#line 5985 "Zend/zend_language_scanner.c" +yy585: + YYDEBUG(585, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy642; - if (yych == 'e') goto yy642; - goto yy128; + if (yybm[0+yych] & 16) { + goto yy43; + } + YYDEBUG(586, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1536 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_ABSTRACT); +} +#line 5998 "Zend/zend_language_scanner.c" yy587: YYDEBUG(587, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy643; - if (yych == 'e') goto yy643; - goto yy128; -yy588: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(588, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy645; - if (yych == 'c') goto yy645; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1572 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_CALLABLE); +} +#line 6011 "Zend/zend_language_scanner.c" yy589: YYDEBUG(589, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy646; - if (yych == 'd') goto yy646; - goto yy128; -yy590: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(590, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy647; - if (yych == 'a') goto yy647; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1368 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_CONTINUE); +} +#line 6024 "Zend/zend_language_scanner.c" yy591: YYDEBUG(591, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy648; - if (yych == 'a') goto yy648; - goto yy128; + if (yych == 'R') goto yy617; + if (yych == 'r') goto yy617; + goto yy44; yy592: YYDEBUG(592, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy649; - if (yych == 'e') goto yy649; - goto yy128; + if (yych == 'C') goto yy618; + if (yych == 'c') goto yy618; + goto yy44; yy593: YYDEBUG(593, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy651; - if (yych == 't') goto yy651; - goto yy128; + if (yych == 'H') goto yy619; + if (yych == 'h') goto yy619; + goto yy44; yy594: YYDEBUG(594, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } YYDEBUG(595, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1552 "Zend/zend_language_scanner.l" +#line 1308 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_PUBLIC); + RETURN_TOKEN(T_ENDWHILE); } -#line 6404 "Zend/zend_language_scanner.c" +#line 6055 "Zend/zend_language_scanner.c" yy596: YYDEBUG(596, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy652; - if (yych == 'e') goto yy652; - goto yy128; -yy597: - YYDEBUG(597, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(598, *YYCURSOR); + YYDEBUG(597, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1258 "Zend/zend_language_scanner.l" +#line 1250 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_RETURN); + RETURN_TOKEN(T_FUNCTION); } -#line 6423 "Zend/zend_language_scanner.c" +#line 6068 "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); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'O') goto yy622; + if (yych == 'o') goto yy622; + goto yy44; +yy600: YYDEBUG(600, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1532 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_STATIC); -} -#line 6436 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'O') goto yy623; + if (yych == 'o') goto yy623; + goto yy44; yy601: YYDEBUG(601, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'F') goto yy624; + if (yych == 'f') goto yy624; + goto yy44; +yy602: YYDEBUG(602, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1348 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_SWITCH); -} -#line 6449 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'E') goto yy626; + if (yych == 'e') goto yy626; + goto yy44; yy603: YYDEBUG(603, *YYCURSOR); - ++YYCURSOR; - YYFILL(5); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'E') goto yy628; + if (yych == 'e') goto yy628; + goto yy44; +yy604: YYDEBUG(604, *YYCURSOR); - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x08) goto yy166; - goto yy603; - } else { - if (yych == '\r') goto yy603; - goto yy166; - } - } else { - if (yych <= 'F') { - if (yych <= ' ') goto yy603; - if (yych <= 'E') goto yy166; - goto yy654; - } else { - if (yych == 'f') goto yy654; - goto yy166; - } - } + yych = *++YYCURSOR; + if (yych == 'D') goto yy630; + if (yych == 'd') goto yy630; + goto yy44; yy605: YYDEBUG(605, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy655; - if (yych == 's') goto yy655; - goto yy128; + if (yych == 'O') goto yy632; + if (yych == 'o') goto yy632; + goto yy44; yy606: YYDEBUG(606, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy656; - goto yy128; + if (yych == 'O') goto yy633; + if (yych == 'o') goto yy633; + goto yy82; yy607: YYDEBUG(607, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy658; - goto yy128; + if (yych == '_') goto yy634; + goto yy44; yy608: YYDEBUG(608, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy659; - if (yych == 't') goto yy659; - goto yy128; -yy609: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(609, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy660; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1894 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_FILE); +} +#line 6140 "Zend/zend_language_scanner.c" yy610: YYDEBUG(610, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy661; - goto yy128; + if (yych == 'O') goto yy636; + if (yych == 'o') goto yy636; + goto yy44; yy611: YYDEBUG(611, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy662; - if (yych == 'o') goto yy662; - goto yy128; + if (yych == 'O') goto yy637; + if (yych == 'o') goto yy637; + goto yy44; yy612: YYDEBUG(612, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy663; - if (yych == 's') goto yy663; - goto yy128; -yy613: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(613, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy664; - if (yych == 't') goto yy664; - goto yy128; -yy614: - YYDEBUG(614, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(615, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1468 "Zend/zend_language_scanner.l" +#line 1890 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_ARRAY_CAST); + RETURN_TOKEN(T_LINE); } -#line 6533 "Zend/zend_language_scanner.c" +#line 6165 "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); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == '_') goto yy640; + goto yy44; +yy617: YYDEBUG(617, *YYCURSOR); - if (yych <= 0x1F) { - if (yych == '\t') goto yy616; - goto yy166; - } else { - if (yych <= ' ') goto yy616; - if (yych == ')') goto yy665; - goto yy166; - } + yych = *++YYCURSOR; + if (yych == 'E') goto yy642; + if (yych == 'e') goto yy642; + goto yy44; yy618: YYDEBUG(618, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy554; - if (yych == 'n') goto yy554; - goto yy166; + if (yych == 'H') goto yy644; + if (yych == 'h') goto yy644; + goto yy44; yy619: YYDEBUG(619, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy466; - if (yych == 'r') goto yy466; - goto yy166; -yy620: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(620, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1352 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_ENDSWITCH); +} +#line 6206 "Zend/zend_language_scanner.c" +yy621: YYDEBUG(621, *YYCURSOR); - if (yych <= 0x1F) { - if (yych == '\t') goto yy620; - goto yy166; - } else { - if (yych <= ' ') goto yy620; - if (yych == ')') goto yy667; - goto yy166; - } + yych = *++YYCURSOR; + if (yych == 'S') goto yy646; + if (yych == 's') goto yy646; + goto yy44; yy622: YYDEBUG(622, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'N') goto yy648; + if (yych == 'n') goto yy648; + goto yy44; +yy623: YYDEBUG(623, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1480 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_UNSET_CAST); -} -#line 6583 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'F') goto yy649; + if (yych == 'f') goto yy649; + goto yy44; yy624: YYDEBUG(624, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy669; - if (yych == 't') goto yy669; - goto yy128; -yy625: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(625, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy671; - if (yych == 'e') goto yy671; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1512 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_INSTEADOF); +} +#line 6237 "Zend/zend_language_scanner.c" yy626: YYDEBUG(626, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy673; - if (yych == 'e') goto yy673; - goto yy128; -yy627: - YYDEBUG(627, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(628, *YYCURSOR); + YYDEBUG(627, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1332 "Zend/zend_language_scanner.l" +#line 1388 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_DECLARE); + RETURN_TOKEN(T_INTERFACE); } -#line 6614 "Zend/zend_language_scanner.c" -yy629: - YYDEBUG(629, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; +#line 6250 "Zend/zend_language_scanner.c" +yy628: + YYDEBUG(628, *YYCURSOR); + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(630, *YYCURSOR); + YYDEBUG(629, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1360 "Zend/zend_language_scanner.l" +#line 1504 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_DEFAULT); + RETURN_TOKEN(T_NAMESPACE); } -#line 6627 "Zend/zend_language_scanner.c" -yy631: - YYDEBUG(631, *YYCURSOR); +#line 6263 "Zend/zend_language_scanner.c" +yy630: + YYDEBUG(630, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy675; - if (yych == 'a') goto yy675; - goto yy128; + if (yybm[0+yych] & 16) { + goto yy43; + } + YYDEBUG(631, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1548 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_PROTECTED); +} +#line 6276 "Zend/zend_language_scanner.c" yy632: YYDEBUG(632, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy676; - if (yych == 'a') goto yy676; - goto yy128; + if (yych == 'N') goto yy651; + if (yych == 'n') goto yy651; + goto yy44; yy633: YYDEBUG(633, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy677; - if (yych == 'c') goto yy677; - goto yy128; + if (yych == 'M') goto yy652; + if (yych == 'm') goto yy652; + goto yy82; yy634: YYDEBUG(634, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy678; - if (yych == 'e') goto yy678; - goto yy128; -yy635: - YYDEBUG(635, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(636, *YYCURSOR); + YYDEBUG(635, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1396 "Zend/zend_language_scanner.l" +#line 1874 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_EXTENDS); + RETURN_TOKEN(T_CLASS_C); } -#line 6664 "Zend/zend_language_scanner.c" +#line 6301 "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); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'M') goto yy654; + if (yych == 'm') goto yy654; + goto yy44; +yy638: YYDEBUG(638, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1280 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_FINALLY); -} -#line 6677 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == '_') goto yy655; + goto yy44; yy639: YYDEBUG(639, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + 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 1324 "Zend/zend_language_scanner.l" +#line 1878 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_FOREACH); + RETURN_TOKEN(T_TRAIT_C); } -#line 6690 "Zend/zend_language_scanner.c" -yy641: - YYDEBUG(641, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'N') goto yy680; - if (yych == 'n') goto yy680; - goto yy128; +#line 6337 "Zend/zend_language_scanner.c" yy642: YYDEBUG(642, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy682; - if (yych == 'n') goto yy682; - goto yy128; -yy643: - YYDEBUG(643, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '^') { - if (yych <= '9') { - if (yych >= '0') goto yy127; - } else { - if (yych <= '@') goto yy644; - if (yych <= 'Z') goto yy127; - } - } else { - if (yych <= '`') { - if (yych <= '_') goto yy683; - } else { - if (yych <= 'z') goto yy127; - if (yych >= 0x80) goto yy127; - } + if (yybm[0+yych] & 16) { + goto yy43; } + YYDEBUG(643, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1336 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_ENDDECLARE); +} +#line 6350 "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 1488 "Zend/zend_language_scanner.l" +#line 1328 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_INCLUDE); + RETURN_TOKEN(T_ENDFOREACH); } -#line 6728 "Zend/zend_language_scanner.c" -yy645: - YYDEBUG(645, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy684; - if (yych == 'e') goto yy684; - goto yy128; +#line 6363 "Zend/zend_language_scanner.c" yy646: YYDEBUG(646, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy685; - if (yych == 'o') goto yy685; - goto yy128; -yy647: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(647, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy686; - if (yych == 'c') goto yy686; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1400 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_IMPLEMENTS); +} +#line 6376 "Zend/zend_language_scanner.c" yy648: YYDEBUG(648, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy687; - if (yych == 'c') goto yy687; - goto yy128; + if (yych == 'C') goto yy658; + if (yych == 'c') goto yy658; + goto yy44; yy649: YYDEBUG(649, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } YYDEBUG(650, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1544 "Zend/zend_language_scanner.l" +#line 1340 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_PRIVATE); + RETURN_TOKEN(T_INSTANCEOF); } -#line 6765 "Zend/zend_language_scanner.c" +#line 6395 "Zend/zend_language_scanner.c" yy651: YYDEBUG(651, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy688; - if (yych == 'e') goto yy688; - goto yy128; + if (yych == 'C') goto yy659; + if (yych == 'c') goto yy659; + goto yy44; yy652: YYDEBUG(652, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '^') { + yych = *++YYCURSOR; + if (yych <= '^') { if (yych <= '9') { - if (yych >= '0') goto yy127; + if (yych <= '/') goto yy660; + goto yy82; } else { - if (yych <= '@') goto yy653; - if (yych <= 'Z') goto yy127; + if (yych <= '@') goto yy660; + if (yych <= 'Z') goto yy82; + goto yy660; } } else { if (yych <= '`') { - if (yych <= '_') goto yy689; + if (yych <= '_') goto yy82; + goto yy660; } else { - if (yych <= 'z') goto yy127; - if (yych >= 0x80) goto yy127; + if (yych <= 'z') goto yy82; + if (yych <= 0x7F) goto yy660; + goto yy82; } } yy653: YYDEBUG(653, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1496 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_REQUIRE); -} -#line 6797 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == '_') goto yy662; + goto yy44; yy654: YYDEBUG(654, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy690; - if (yych == 'r') goto yy690; - goto yy166; + if (yych == 'P') goto yy663; + if (yych == 'p') goto yy663; + goto yy44; yy655: YYDEBUG(655, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy691; - goto yy128; -yy656: - YYDEBUG(656, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(657, *YYCURSOR); + YYDEBUG(656, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1898 "Zend/zend_language_scanner.l" +#line 1886 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_DIR); + RETURN_TOKEN(T_METHOD_C); } -#line 6821 "Zend/zend_language_scanner.c" +#line 6447 "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 == '_') goto yy692; - goto yy128; + if (yych == 'E') goto yy665; + if (yych == 'e') goto yy665; + goto yy44; yy659: YYDEBUG(659, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy694; - if (yych == 'i') goto yy694; - goto yy128; + if (yych == 'E') goto yy667; + if (yych == 'e') goto yy667; + goto yy44; yy660: YYDEBUG(660, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy695; - if (yych == 'c') goto yy695; - goto yy128; -yy661: + ++YYCURSOR; YYDEBUG(661, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy696; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1262 "Zend/zend_language_scanner.l" + { + yyless(yyleng - 1); + HANDLE_NEWLINES(yytext, yyleng); + RETURN_TOKEN(T_YIELD_FROM); +} +#line 6477 "Zend/zend_language_scanner.c" yy662: YYDEBUG(662, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy698; - if (yych == 'd') goto yy698; - goto yy128; + if (yych == '_') goto yy669; + goto yy44; yy663: YYDEBUG(663, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy699; - if (yych == 'p') goto yy699; - goto yy128; + if (yych == 'I') goto yy671; + if (yych == 'i') goto yy671; + goto yy44; yy664: YYDEBUG(664, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy700; - goto yy128; + if (yych == '_') goto yy672; + goto yy44; yy665: YYDEBUG(665, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(666, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1464 "Zend/zend_language_scanner.l" +#line 1492 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_STRING_CAST); + RETURN_TOKEN(T_INCLUDE_ONCE); } -#line 6870 "Zend/zend_language_scanner.c" +#line 6506 "Zend/zend_language_scanner.c" yy667: YYDEBUG(667, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(668, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1472 "Zend/zend_language_scanner.l" +#line 1500 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_OBJECT_CAST); + RETURN_TOKEN(T_REQUIRE_ONCE); } -#line 6880 "Zend/zend_language_scanner.c" +#line 6519 "Zend/zend_language_scanner.c" yy669: YYDEBUG(669, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } YYDEBUG(670, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1536 "Zend/zend_language_scanner.l" +#line 1882 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_ABSTRACT); + RETURN_TOKEN(T_FUNC_C); } -#line 6893 "Zend/zend_language_scanner.c" +#line 6532 "Zend/zend_language_scanner.c" yy671: YYDEBUG(671, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'L') goto yy673; + if (yych == 'l') goto yy673; + goto yy44; +yy672: YYDEBUG(672, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1572 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_CALLABLE); -} -#line 6906 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == '_') goto yy674; + goto yy44; yy673: YYDEBUG(673, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + 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 1368 "Zend/zend_language_scanner.l" +#line 1902 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_CONTINUE); + RETURN_TOKEN(T_NS_C); } -#line 6919 "Zend/zend_language_scanner.c" -yy675: - YYDEBUG(675, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy701; - if (yych == 'r') goto yy701; - goto yy128; +#line 6562 "Zend/zend_language_scanner.c" yy676: YYDEBUG(676, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy702; - if (yych == 'c') goto yy702; - goto yy128; + if (yych == 'R') goto yy677; + if (yych != 'r') goto yy44; yy677: YYDEBUG(677, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy703; - if (yych == 'h') goto yy703; - goto yy128; -yy678: - YYDEBUG(678, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(679, *YYCURSOR); + YYDEBUG(678, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1308 "Zend/zend_language_scanner.l" +#line 1528 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_ENDWHILE); + RETURN_TOKEN(T_HALT_COMPILER); } -#line 6950 "Zend/zend_language_scanner.c" -yy680: - YYDEBUG(680, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; +#line 6580 "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 1250 "Zend/zend_language_scanner.l" +#line 1422 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_FUNCTION); + yyless(0); + yy_pop_state(); + goto restart; } -#line 6963 "Zend/zend_language_scanner.c" -yy682: - YYDEBUG(682, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy705; - if (yych == 't') goto yy705; - goto yy128; +#line 6652 "Zend/zend_language_scanner.c" yy683: YYDEBUG(683, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'O') goto yy706; - if (yych == 'o') goto yy706; - goto yy128; -yy684: + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; YYDEBUG(684, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'O') goto yy707; - if (yych == 'o') goto yy707; - goto yy128; -yy685: + if (yybm[0+yych] & 64) { + goto yy683; + } YYDEBUG(685, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'F') goto yy708; - if (yych == 'f') goto yy708; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1409 "Zend/zend_language_scanner.l" + { + goto return_whitespace; +} +#line 6668 "Zend/zend_language_scanner.c" yy686: YYDEBUG(686, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy710; - if (yych == 'e') goto yy710; - goto yy128; + if (yych == '>') goto yy690; + goto yy682; yy687: YYDEBUG(687, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy712; - if (yych == 'e') goto yy712; - goto yy128; -yy688: + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; YYDEBUG(688, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'D') goto yy714; - if (yych == 'd') goto yy714; - goto yy128; -yy689: + if (yybm[0+yych] & 128) { + goto yy687; + } YYDEBUG(689, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'O') goto yy716; - if (yych == 'o') goto yy716; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1417 "Zend/zend_language_scanner.l" + { + yy_pop_state(); + RETURN_TOKEN_WITH_STR(T_STRING, 0); +} +#line 6690 "Zend/zend_language_scanner.c" yy690: YYDEBUG(690, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'O') goto yy717; - if (yych == 'o') goto yy717; - goto yy166; -yy691: - YYDEBUG(691, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy718; - goto yy128; -yy692: - YYDEBUG(692, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(693, *YYCURSOR); + YYDEBUG(691, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1894 "Zend/zend_language_scanner.l" +#line 1413 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_FILE); + RETURN_TOKEN(T_OBJECT_OPERATOR); } -#line 7035 "Zend/zend_language_scanner.c" -yy694: +#line 6700 "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); - yych = *++YYCURSOR; - if (yych == 'O') goto yy720; - if (yych == 'o') goto yy720; - goto yy128; + ++YYCURSOR; yy695: YYDEBUG(695, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'O') goto yy721; - if (yych == 'o') goto yy721; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 2472 "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 6798 "Zend/zend_language_scanner.c" yy696: YYDEBUG(696, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + 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 1890 "Zend/zend_language_scanner.l" +#line 2412 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_LINE); + BEGIN(ST_IN_SCRIPTING); + RETURN_TOKEN('`'); } -#line 7060 "Zend/zend_language_scanner.c" -yy698: - YYDEBUG(698, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy722; - goto yy128; +#line 6827 "Zend/zend_language_scanner.c" yy699: YYDEBUG(699, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy723; - if (yych == 'a') goto yy723; - goto yy128; + if (yych == '$') goto yy705; + goto yy695; yy700: YYDEBUG(700, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy724; - goto yy128; -yy701: + YYMARKER = ++YYCURSOR; + YYFILL(3); + yych = *YYCURSOR; YYDEBUG(701, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy726; - if (yych == 'e') goto yy726; - goto yy128; + if (yybm[0+yych] & 128) { + goto yy700; + } + if (yych == '-') goto yy707; + if (yych <= '@') goto yy702; + if (yych <= '[') goto yy709; yy702: YYDEBUG(702, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'H') goto yy728; - if (yych == 'h') goto yy728; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 2003 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); +} +#line 6852 "Zend/zend_language_scanner.c" yy703: YYDEBUG(703, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } YYDEBUG(704, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1352 "Zend/zend_language_scanner.l" +#line 1703 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_ENDSWITCH); + yy_push_state(ST_LOOKING_FOR_VARNAME); + RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES); } -#line 7101 "Zend/zend_language_scanner.c" +#line 6863 "Zend/zend_language_scanner.c" yy705: YYDEBUG(705, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'S') goto yy730; - if (yych == 's') goto yy730; - goto yy128; -yy706: + ++YYCURSOR; YYDEBUG(706, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'N') goto yy732; - if (yych == 'n') goto yy732; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 2400 "Zend/zend_language_scanner.l" + { + yy_push_state(ST_IN_SCRIPTING); + yyless(1); + RETURN_TOKEN(T_CURLY_OPEN); +} +#line 6875 "Zend/zend_language_scanner.c" yy707: YYDEBUG(707, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy733; - if (yych == 'f') goto yy733; - goto yy128; + if (yych == '>') goto yy711; yy708: YYDEBUG(708, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + YYCURSOR = YYMARKER; + goto yy702; +yy709: YYDEBUG(709, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1512 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_INSTEADOF); -} -#line 7132 "Zend/zend_language_scanner.c" -yy710: - YYDEBUG(710, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(711, *YYCURSOR); + YYDEBUG(710, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1388 "Zend/zend_language_scanner.l" +#line 1997 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_INTERFACE); + yyless(yyleng - 1); + yy_push_state(ST_VAR_OFFSET); + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 7145 "Zend/zend_language_scanner.c" +#line 6895 "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; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } YYDEBUG(713, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1504 "Zend/zend_language_scanner.l" +#line 1989 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_NAMESPACE); + yyless(yyleng - 3); + yy_push_state(ST_LOOKING_FOR_PROPERTY); + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 7158 "Zend/zend_language_scanner.c" -yy714: +#line 6919 "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); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + YYFILL(2); + yych = *YYCURSOR; + if (yych <= '#') { + if (yych == '"') goto yy718; + } else { + if (yych <= '$') goto yy720; + if (yych == '{') goto yy721; } - YYDEBUG(715, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1548 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_PROTECTED); -} -#line 7171 "Zend/zend_language_scanner.c" -yy716: YYDEBUG(716, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'N') goto yy735; - if (yych == 'n') goto yy735; - goto yy128; + ++YYCURSOR; yy717: YYDEBUG(717, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'M') goto yy736; - if (yych == 'm') goto yy736; - goto yy166; -yy718: - YYDEBUG(718, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(719, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1874 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_CLASS_C); -} -#line 7196 "Zend/zend_language_scanner.c" -yy720: - YYDEBUG(720, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'N') goto yy737; - if (yych == 'n') goto yy737; - goto yy128; -yy721: - YYDEBUG(721, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'M') goto yy738; - if (yych == 'm') goto yy738; - goto yy128; -yy722: - YYDEBUG(722, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy739; - goto yy128; -yy723: - YYDEBUG(723, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy741; - if (yych == 'c') goto yy741; - goto yy128; -yy724: - YYDEBUG(724, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(725, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1878 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_TRAIT_C); -} -#line 7232 "Zend/zend_language_scanner.c" -yy726: - YYDEBUG(726, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(727, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1336 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_ENDDECLARE); -} -#line 7245 "Zend/zend_language_scanner.c" -yy728: - YYDEBUG(728, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(729, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1328 "Zend/zend_language_scanner.l" +#line 2418 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_ENDFOREACH); -} -#line 7258 "Zend/zend_language_scanner.c" -yy730: - YYDEBUG(730, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + 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; } - YYDEBUG(731, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1400 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_IMPLEMENTS); + + 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 7271 "Zend/zend_language_scanner.c" -yy732: - YYDEBUG(732, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy742; - if (yych == 'c') goto yy742; - goto yy128; -yy733: - YYDEBUG(733, *YYCURSOR); +#line 7025 "Zend/zend_language_scanner.c" +yy718: + YYDEBUG(718, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(734, *YYCURSOR); + YYDEBUG(719, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1340 "Zend/zend_language_scanner.l" +#line 2407 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_INSTANCEOF); + BEGIN(ST_IN_SCRIPTING); + RETURN_TOKEN('"'); } -#line 7290 "Zend/zend_language_scanner.c" -yy735: - YYDEBUG(735, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy743; - if (yych == 'c') goto yy743; - goto yy128; -yy736: - YYDEBUG(736, *YYCURSOR); +#line 7036 "Zend/zend_language_scanner.c" +yy720: + YYDEBUG(720, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '9') { - if (yych <= '/') goto yy744; - goto yy166; - } else { - if (yych <= '@') goto yy744; - if (yych <= 'Z') goto yy166; - goto yy744; - } + if (yych <= '_') { + if (yych <= '@') goto yy717; + if (yych <= 'Z') goto yy722; + if (yych <= '^') goto yy717; + goto yy722; } else { - if (yych <= '`') { - if (yych <= '_') goto yy166; - goto yy744; + if (yych <= 'z') { + if (yych <= '`') goto yy717; + goto yy722; } else { - if (yych <= 'z') goto yy166; - if (yych <= 0x7F) goto yy744; - goto yy166; + if (yych <= '{') goto yy725; + if (yych <= 0x7F) goto yy717; + goto yy722; } } -yy737: - YYDEBUG(737, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy746; - goto yy128; -yy738: - YYDEBUG(738, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'P') goto yy747; - if (yych == 'p') goto yy747; - goto yy128; -yy739: - YYDEBUG(739, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(740, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1886 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_METHOD_C); -} -#line 7342 "Zend/zend_language_scanner.c" -yy741: - YYDEBUG(741, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy748; - if (yych == 'e') goto yy748; - goto yy128; -yy742: - YYDEBUG(742, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy749; - if (yych == 'e') goto yy749; - goto yy128; -yy743: - YYDEBUG(743, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy751; - if (yych == 'e') goto yy751; - goto yy128; -yy744: - YYDEBUG(744, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(745, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1262 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 1); - HANDLE_NEWLINES(yytext, yyleng); - RETURN_TOKEN(T_YIELD_FROM); -} -#line 7372 "Zend/zend_language_scanner.c" -yy746: - YYDEBUG(746, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy753; - goto yy128; -yy747: - YYDEBUG(747, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'I') goto yy755; - if (yych == 'i') goto yy755; - goto yy128; -yy748: - YYDEBUG(748, *YYCURSOR); +yy721: + YYDEBUG(721, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy756; - goto yy128; -yy749: - YYDEBUG(749, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + 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; } - YYDEBUG(750, *YYCURSOR); + if (yych == '-') goto yy729; + if (yych <= '@') goto yy724; + if (yych <= '[') goto yy731; +yy724: + YYDEBUG(724, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1492 "Zend/zend_language_scanner.l" +#line 2003 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_INCLUDE_ONCE); + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 7401 "Zend/zend_language_scanner.c" -yy751: - YYDEBUG(751, *YYCURSOR); +#line 7079 "Zend/zend_language_scanner.c" +yy725: + YYDEBUG(725, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(752, *YYCURSOR); + YYDEBUG(726, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1500 "Zend/zend_language_scanner.l" +#line 1703 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_REQUIRE_ONCE); + yy_push_state(ST_LOOKING_FOR_VARNAME); + RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES); } -#line 7414 "Zend/zend_language_scanner.c" -yy753: - YYDEBUG(753, *YYCURSOR); +#line 7090 "Zend/zend_language_scanner.c" +yy727: + YYDEBUG(727, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(754, *YYCURSOR); + YYDEBUG(728, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1882 "Zend/zend_language_scanner.l" +#line 2400 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_FUNC_C); + yy_push_state(ST_IN_SCRIPTING); + yyless(1); + RETURN_TOKEN(T_CURLY_OPEN); } -#line 7427 "Zend/zend_language_scanner.c" -yy755: - YYDEBUG(755, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy757; - if (yych == 'l') goto yy757; - goto yy128; -yy756: - YYDEBUG(756, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy758; - goto yy128; -yy757: - YYDEBUG(757, *YYCURSOR); +#line 7102 "Zend/zend_language_scanner.c" +yy729: + YYDEBUG(729, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy760; - if (yych == 'e') goto yy760; - goto yy128; -yy758: - YYDEBUG(758, *YYCURSOR); + if (yych == '>') goto yy733; +yy730: + YYDEBUG(730, *YYCURSOR); + YYCURSOR = YYMARKER; + goto yy724; +yy731: + YYDEBUG(731, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(759, *YYCURSOR); + YYDEBUG(732, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1902 "Zend/zend_language_scanner.l" +#line 1997 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_NS_C); + yyless(yyleng - 1); + yy_push_state(ST_VAR_OFFSET); + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 7457 "Zend/zend_language_scanner.c" -yy760: - YYDEBUG(760, *YYCURSOR); +#line 7122 "Zend/zend_language_scanner.c" +yy733: + YYDEBUG(733, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy761; - if (yych != 'r') goto yy128; -yy761: - YYDEBUG(761, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + 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; } - YYDEBUG(762, *YYCURSOR); +yy734: + YYDEBUG(734, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(735, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1528 "Zend/zend_language_scanner.l" +#line 1989 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_HALT_COMPILER); + yyless(yyleng - 3); + yy_push_state(ST_LOOKING_FOR_PROPERTY); + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 7475 "Zend/zend_language_scanner.c" +#line 7146 "Zend/zend_language_scanner.c" } /* *********************************** */ -yyc_ST_LOOKING_FOR_PROPERTY: +yyc_ST_HEREDOC: { 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, + 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, @@ -7510,88 +7181,244 @@ int start_line = CG(zend_lineno); 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; - YYDEBUG(763, *YYCURSOR); + YYDEBUG(736, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; - if (yybm[0+yych] & 64) { - goto yy767; + if (yych == '$') goto yy740; + if (yych == '{') goto yy741; + YYDEBUG(738, *YYCURSOR); + ++YYCURSOR; +yy739: + YYDEBUG(739, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 2518 "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_START(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); + } + + /* 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; } - if (yych <= '^') { - if (yych <= '-') { - if (yych >= '-') goto yy770; - } else { - if (yych <= '@') goto yy765; - if (yych <= 'Z') goto yy771; - } + + YYCURSOR--; + break; + } + +heredoc_scan_done: + + yyleng = YYCURSOR - SCNG(yy_text); + ZVAL_STRINGL(zendlval, yytext, yyleng); + + if (!SCNG(heredoc_scan_ahead) && !EG(exception) && PARSER_MODE()) { + zend_string *copy = Z_STR_P(zendlval); + + if (!strip_multiline_string_indentation(zendlval, newline, heredoc_label->indentation, heredoc_label->indentation_uses_spaces)) { + 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 7312 "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 <= '`') { - if (yych <= '_') goto yy771; + if (yych <= 'z') { + if (yych <= '`') goto yy739; + goto yy742; } else { - if (yych <= 'z') goto yy771; - if (yych >= 0x80) goto yy771; + if (yych <= '{') goto yy745; + if (yych <= 0x7F) goto yy739; + goto yy742; } } -yy765: - YYDEBUG(765, *YYCURSOR); +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 2003 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); +} +#line 7355 "Zend/zend_language_scanner.c" +yy745: + YYDEBUG(745, *YYCURSOR); ++YYCURSOR; -yy766: - YYDEBUG(766, *YYCURSOR); + YYDEBUG(746, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1422 "Zend/zend_language_scanner.l" +#line 1703 "Zend/zend_language_scanner.l" { - yyless(0); - yy_pop_state(); - goto restart; + yy_push_state(ST_LOOKING_FOR_VARNAME); + RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES); } -#line 7547 "Zend/zend_language_scanner.c" -yy767: - YYDEBUG(767, *YYCURSOR); +#line 7366 "Zend/zend_language_scanner.c" +yy747: + YYDEBUG(747, *YYCURSOR); ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(768, *YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy767; - } - YYDEBUG(769, *YYCURSOR); + YYDEBUG(748, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1409 "Zend/zend_language_scanner.l" +#line 2400 "Zend/zend_language_scanner.l" { - goto return_whitespace; + yy_push_state(ST_IN_SCRIPTING); + yyless(1); + RETURN_TOKEN(T_CURLY_OPEN); } -#line 7563 "Zend/zend_language_scanner.c" -yy770: - YYDEBUG(770, *YYCURSOR); +#line 7378 "Zend/zend_language_scanner.c" +yy749: + YYDEBUG(749, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '>') goto yy774; - goto yy766; -yy771: - YYDEBUG(771, *YYCURSOR); + if (yych == '>') goto yy753; +yy750: + YYDEBUG(750, *YYCURSOR); + YYCURSOR = YYMARKER; + goto yy744; +yy751: + YYDEBUG(751, *YYCURSOR); ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(772, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy771; - } - YYDEBUG(773, *YYCURSOR); + YYDEBUG(752, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1417 "Zend/zend_language_scanner.l" +#line 1997 "Zend/zend_language_scanner.l" { - yy_pop_state(); - RETURN_TOKEN_WITH_STR(T_STRING, 0); + yyless(yyleng - 1); + yy_push_state(ST_VAR_OFFSET); + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 7585 "Zend/zend_language_scanner.c" -yy774: - YYDEBUG(774, *YYCURSOR); +#line 7398 "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(775, *YYCURSOR); + YYDEBUG(755, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1413 "Zend/zend_language_scanner.l" +#line 1989 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_OBJECT_OPERATOR); + yyless(yyleng - 3); + yy_push_state(ST_LOOKING_FOR_PROPERTY); + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 7595 "Zend/zend_language_scanner.c" +#line 7422 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_LOOKING_FOR_VARNAME: @@ -7630,23 +7457,23 @@ int start_line = CG(zend_lineno); 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; - YYDEBUG(776, *YYCURSOR); + YYDEBUG(756, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; if (yych <= '_') { - if (yych <= '@') goto yy778; - if (yych <= 'Z') goto yy780; - if (yych >= '_') goto yy780; + if (yych <= '@') goto yy758; + if (yych <= 'Z') goto yy760; + if (yych >= '_') goto yy760; } else { - if (yych <= '`') goto yy778; - if (yych <= 'z') goto yy780; - if (yych >= 0x80) goto yy780; + if (yych <= '`') goto yy758; + if (yych <= 'z') goto yy760; + if (yych >= 0x80) goto yy760; } -yy778: - YYDEBUG(778, *YYCURSOR); +yy758: + YYDEBUG(758, *YYCURSOR); ++YYCURSOR; -yy779: - YYDEBUG(779, *YYCURSOR); +yy759: + YYDEBUG(759, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1726 "Zend/zend_language_scanner.l" { @@ -7655,52 +7482,52 @@ int start_line = CG(zend_lineno); yy_push_state(ST_IN_SCRIPTING); goto restart; } -#line 7659 "Zend/zend_language_scanner.c" -yy780: - YYDEBUG(780, *YYCURSOR); +#line 7486 "Zend/zend_language_scanner.c" +yy760: + YYDEBUG(760, *YYCURSOR); yych = *(YYMARKER = ++YYCURSOR); if (yych <= '_') { if (yych <= '@') { - if (yych <= '/') goto yy779; - if (yych <= '9') goto yy782; - goto yy779; + if (yych <= '/') goto yy759; + if (yych <= '9') goto yy762; + goto yy759; } else { - if (yych <= '[') goto yy782; - if (yych <= '^') goto yy779; - goto yy782; + if (yych <= '[') goto yy762; + if (yych <= '^') goto yy759; + goto yy762; } } else { if (yych <= '|') { - if (yych <= '`') goto yy779; - if (yych <= 'z') goto yy782; - goto yy779; + if (yych <= '`') goto yy759; + if (yych <= 'z') goto yy762; + goto yy759; } else { - if (yych <= '}') goto yy782; - if (yych <= 0x7F) goto yy779; - goto yy782; + if (yych <= '}') goto yy762; + if (yych <= 0x7F) goto yy759; + goto yy762; } } -yy781: - YYDEBUG(781, *YYCURSOR); +yy761: + YYDEBUG(761, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy782: - YYDEBUG(782, *YYCURSOR); +yy762: + YYDEBUG(762, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy781; + goto yy761; } - if (yych <= '@') goto yy783; - if (yych <= '[') goto yy784; - if (yych == '}') goto yy784; -yy783: - YYDEBUG(783, *YYCURSOR); + if (yych <= '@') goto yy763; + if (yych <= '[') goto yy764; + if (yych == '}') goto yy764; +yy763: + YYDEBUG(763, *YYCURSOR); YYCURSOR = YYMARKER; - goto yy779; -yy784: - YYDEBUG(784, *YYCURSOR); + goto yy759; +yy764: + YYDEBUG(764, *YYCURSOR); ++YYCURSOR; - YYDEBUG(785, *YYCURSOR); + YYDEBUG(765, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1718 "Zend/zend_language_scanner.l" { @@ -7709,101 +7536,8 @@ int start_line = CG(zend_lineno); yy_push_state(ST_IN_SCRIPTING); RETURN_TOKEN_WITH_STR(T_STRING_VARNAME, 0); } -#line 7713 "Zend/zend_language_scanner.c" - } -/* *********************************** */ -yyc_ST_NOWDOC: - YYDEBUG(786, *YYCURSOR); - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(788, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(789, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2636 "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_START(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); - } - - /* 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); - - if (!EG(exception) && spacing != -1 && PARSER_MODE() - && !strip_multiline_string_indentation(zendlval, newline, indentation, spacing == HEREDOC_USING_SPACES)) { - RETURN_TOKEN(T_ERROR); +#line 7540 "Zend/zend_language_scanner.c" } - - HANDLE_NEWLINES(yytext, yyleng - newline); - RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); -} -#line 7807 "Zend/zend_language_scanner.c" /* *********************************** */ yyc_ST_VAR_OFFSET: { @@ -7841,55 +7575,55 @@ int start_line = CG(zend_lineno); 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, }; - YYDEBUG(790, *YYCURSOR); + YYDEBUG(766, *YYCURSOR); YYFILL(3); yych = *YYCURSOR; if (yych <= '0') { if (yych <= ' ') { if (yych <= '\f') { - if (yych <= 0x08) goto yy792; - if (yych <= '\n') goto yy794; + if (yych <= 0x08) goto yy768; + if (yych <= '\n') goto yy770; } else { - if (yych <= '\r') goto yy794; - if (yych >= ' ') goto yy794; + if (yych <= '\r') goto yy770; + if (yych >= ' ') goto yy770; } } else { if (yych <= '$') { - if (yych <= '"') goto yy796; - if (yych <= '#') goto yy794; - goto yy798; + if (yych <= '"') goto yy772; + if (yych <= '#') goto yy770; + goto yy774; } else { - if (yych == '\'') goto yy794; - if (yych <= '/') goto yy796; - goto yy799; + if (yych == '\'') goto yy770; + if (yych <= '/') goto yy772; + goto yy775; } } } else { if (yych <= ']') { if (yych <= 'Z') { - if (yych <= '9') goto yy801; - if (yych <= '@') goto yy796; - goto yy803; + if (yych <= '9') goto yy777; + if (yych <= '@') goto yy772; + goto yy779; } else { - if (yych <= '[') goto yy796; - if (yych <= '\\') goto yy794; - goto yy806; + if (yych <= '[') goto yy772; + if (yych <= '\\') goto yy770; + goto yy782; } } else { if (yych <= '`') { - if (yych == '_') goto yy803; - goto yy796; + if (yych == '_') goto yy779; + goto yy772; } else { - if (yych <= 'z') goto yy803; - if (yych <= '~') goto yy796; - if (yych >= 0x80) goto yy803; + if (yych <= 'z') goto yy779; + if (yych <= '~') goto yy772; + if (yych >= 0x80) goto yy779; } } } -yy792: - YYDEBUG(792, *YYCURSOR); +yy768: + YYDEBUG(768, *YYCURSOR); ++YYCURSOR; - YYDEBUG(793, *YYCURSOR); + YYDEBUG(769, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2720 "Zend/zend_language_scanner.l" { @@ -7900,11 +7634,11 @@ int start_line = CG(zend_lineno); zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); goto restart; } -#line 7904 "Zend/zend_language_scanner.c" -yy794: - YYDEBUG(794, *YYCURSOR); +#line 7638 "Zend/zend_language_scanner.c" +yy770: + YYDEBUG(770, *YYCURSOR); ++YYCURSOR; - YYDEBUG(795, *YYCURSOR); + YYDEBUG(771, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2017 "Zend/zend_language_scanner.l" { @@ -7914,52 +7648,52 @@ int start_line = CG(zend_lineno); ZVAL_NULL(zendlval); RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); } -#line 7918 "Zend/zend_language_scanner.c" -yy796: - YYDEBUG(796, *YYCURSOR); +#line 7652 "Zend/zend_language_scanner.c" +yy772: + YYDEBUG(772, *YYCURSOR); ++YYCURSOR; -yy797: - YYDEBUG(797, *YYCURSOR); +yy773: + YYDEBUG(773, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2012 "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 7930 "Zend/zend_language_scanner.c" -yy798: - YYDEBUG(798, *YYCURSOR); +#line 7664 "Zend/zend_language_scanner.c" +yy774: + YYDEBUG(774, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '_') { - if (yych <= '@') goto yy797; - if (yych <= 'Z') goto yy808; - if (yych <= '^') goto yy797; - goto yy808; + if (yych <= '@') goto yy773; + if (yych <= 'Z') goto yy784; + if (yych <= '^') goto yy773; + goto yy784; } else { - if (yych <= '`') goto yy797; - if (yych <= 'z') goto yy808; - if (yych <= 0x7F) goto yy797; - goto yy808; + if (yych <= '`') goto yy773; + if (yych <= 'z') goto yy784; + if (yych <= 0x7F) goto yy773; + goto yy784; } -yy799: - YYDEBUG(799, *YYCURSOR); +yy775: + YYDEBUG(775, *YYCURSOR); yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'W') { if (yych <= '9') { - if (yych >= '0') goto yy811; + if (yych >= '0') goto yy787; } else { - if (yych == 'B') goto yy814; + if (yych == 'B') goto yy790; } } else { if (yych <= 'b') { - if (yych <= 'X') goto yy816; - if (yych >= 'b') goto yy814; + if (yych <= 'X') goto yy792; + if (yych >= 'b') goto yy790; } else { - if (yych == 'x') goto yy816; + if (yych == 'x') goto yy792; } } -yy800: - YYDEBUG(800, *YYCURSOR); +yy776: + YYDEBUG(776, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1840 "Zend/zend_language_scanner.l" { /* Offset could be treated as a long */ @@ -7977,83 +7711,83 @@ int start_line = CG(zend_lineno); } RETURN_TOKEN_WITH_VAL(T_NUM_STRING); } -#line 7981 "Zend/zend_language_scanner.c" -yy801: - YYDEBUG(801, *YYCURSOR); +#line 7715 "Zend/zend_language_scanner.c" +yy777: + YYDEBUG(777, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(802, *YYCURSOR); + YYDEBUG(778, *YYCURSOR); if (yybm[0+yych] & 16) { - goto yy801; + goto yy777; } - goto yy800; -yy803: - YYDEBUG(803, *YYCURSOR); + goto yy776; +yy779: + YYDEBUG(779, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(804, *YYCURSOR); + YYDEBUG(780, *YYCURSOR); if (yybm[0+yych] & 32) { - goto yy803; + goto yy779; } - YYDEBUG(805, *YYCURSOR); + YYDEBUG(781, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2025 "Zend/zend_language_scanner.l" { RETURN_TOKEN_WITH_STR(T_STRING, 0); } -#line 8007 "Zend/zend_language_scanner.c" -yy806: - YYDEBUG(806, *YYCURSOR); +#line 7741 "Zend/zend_language_scanner.c" +yy782: + YYDEBUG(782, *YYCURSOR); ++YYCURSOR; - YYDEBUG(807, *YYCURSOR); + YYDEBUG(783, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2007 "Zend/zend_language_scanner.l" { yy_pop_state(); RETURN_TOKEN(']'); } -#line 8018 "Zend/zend_language_scanner.c" -yy808: - YYDEBUG(808, *YYCURSOR); +#line 7752 "Zend/zend_language_scanner.c" +yy784: + YYDEBUG(784, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(809, *YYCURSOR); + YYDEBUG(785, *YYCURSOR); if (yych <= '^') { if (yych <= '9') { - if (yych >= '0') goto yy808; + if (yych >= '0') goto yy784; } else { - if (yych <= '@') goto yy810; - if (yych <= 'Z') goto yy808; + if (yych <= '@') goto yy786; + if (yych <= 'Z') goto yy784; } } else { if (yych <= '`') { - if (yych <= '_') goto yy808; + if (yych <= '_') goto yy784; } else { - if (yych <= 'z') goto yy808; - if (yych >= 0x80) goto yy808; + if (yych <= 'z') goto yy784; + if (yych >= 0x80) goto yy784; } } -yy810: - YYDEBUG(810, *YYCURSOR); +yy786: + YYDEBUG(786, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2003 "Zend/zend_language_scanner.l" { RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 8047 "Zend/zend_language_scanner.c" -yy811: - YYDEBUG(811, *YYCURSOR); +#line 7781 "Zend/zend_language_scanner.c" +yy787: + YYDEBUG(787, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(812, *YYCURSOR); - if (yych <= '/') goto yy813; - if (yych <= '9') goto yy811; -yy813: - YYDEBUG(813, *YYCURSOR); + YYDEBUG(788, *YYCURSOR); + if (yych <= '/') goto yy789; + if (yych <= '9') goto yy787; +yy789: + YYDEBUG(789, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1856 "Zend/zend_language_scanner.l" { /* Offset must be treated as a string */ @@ -8064,45 +7798,307 @@ int start_line = CG(zend_lineno); } RETURN_TOKEN_WITH_VAL(T_NUM_STRING); } -#line 8068 "Zend/zend_language_scanner.c" -yy814: - YYDEBUG(814, *YYCURSOR); +#line 7802 "Zend/zend_language_scanner.c" +yy790: + YYDEBUG(790, *YYCURSOR); yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy817; + goto yy793; } -yy815: - YYDEBUG(815, *YYCURSOR); +yy791: + YYDEBUG(791, *YYCURSOR); YYCURSOR = YYMARKER; - goto yy800; -yy816: - YYDEBUG(816, *YYCURSOR); + goto yy776; +yy792: + YYDEBUG(792, *YYCURSOR); yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy819; + goto yy795; } - goto yy815; -yy817: - YYDEBUG(817, *YYCURSOR); + goto yy791; +yy793: + YYDEBUG(793, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(818, *YYCURSOR); + YYDEBUG(794, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy817; + goto yy793; } - goto yy813; -yy819: - YYDEBUG(819, *YYCURSOR); + goto yy789; +yy795: + YYDEBUG(795, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(820, *YYCURSOR); + YYDEBUG(796, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy819; + 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 1938 "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 7899 "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 1926 "Zend/zend_language_scanner.l" + { + if (CG(short_tags)) { + BEGIN(ST_IN_SCRIPTING); + if (EXPECTED(elem != NULL)) { + SKIP_TOKEN(T_OPEN_TAG); + } + RETURN_TOKEN(T_OPEN_TAG); + } else { + goto inline_char_handler; + } +} +#line 7927 "Zend/zend_language_scanner.c" +yy804: + YYDEBUG(804, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(805, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1907 "Zend/zend_language_scanner.l" + { + BEGIN(ST_IN_SCRIPTING); + if (PARSER_MODE()) { + RETURN_TOKEN(T_ECHO); + } + RETURN_TOKEN(T_OPEN_TAG_WITH_ECHO); +} +#line 7941 "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 1916 "Zend/zend_language_scanner.l" + { + HANDLE_NEWLINE(yytext[yyleng-1]); + BEGIN(ST_IN_SCRIPTING); + if (EXPECTED(elem != NULL)) { + SKIP_TOKEN(T_OPEN_TAG); + } + RETURN_TOKEN(T_OPEN_TAG); +} +#line 7981 "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 2386 "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 8009 "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 2636 "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_START(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); + } + + /* 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; } - goto yy813; } + +nowdoc_scan_done: + yyleng = YYCURSOR - SCNG(yy_text); + ZVAL_STRINGL(zendlval, yytext, yyleng); + + if (!EG(exception) && spacing != -1 && PARSER_MODE() + && !strip_multiline_string_indentation(zendlval, newline, indentation, spacing == HEREDOC_USING_SPACES)) { + RETURN_TOKEN(T_ERROR); + } + + HANDLE_NEWLINES(yytext, yyleng - newline); + RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); +} +#line 8102 "Zend/zend_language_scanner.c" } #line 2729 "Zend/zend_language_scanner.l" diff --git a/Zend/zend_language_scanner_defs.h b/Zend/zend_language_scanner_defs.h index c89b1bba457d..3c01b5bc7616 100644 --- a/Zend/zend_language_scanner_defs.h +++ b/Zend/zend_language_scanner_defs.h @@ -1,4 +1,4 @@ -/* Generated by re2c 0.16 */ +/* Generated by re2c 1.0.1 */ #line 3 "Zend/zend_language_scanner_defs.h" enum YYCONDTYPE { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index de391a931acc..9114a9689c06 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -872,7 +872,7 @@ ZEND_VM_C_LABEL(assign_op_object): } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -2387,7 +2387,7 @@ ZEND_VM_C_LABEL(assign_object): if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); FREE_OP_DATA(); FREE_OP2(); FREE_OP1_VAR_PTR(); @@ -9190,7 +9190,7 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_FE_FETCH_R, op->op2_type == IS_CV && (op1_inf } variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC); - 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 7ab280342b7e..448b24afa300 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -22059,7 +22059,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -22961,7 +22961,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -23102,7 +23102,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -23243,7 +23243,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -23384,7 +23384,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -23935,7 +23935,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -24061,7 +24061,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -24850,7 +24850,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -25757,7 +25757,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25898,7 +25898,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26039,7 +26039,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26180,7 +26180,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26675,7 +26675,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -26801,7 +26801,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -29104,7 +29104,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -30006,7 +30006,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -30147,7 +30147,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -30288,7 +30288,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -30429,7 +30429,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31029,7 +31029,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -31155,7 +31155,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -31797,7 +31797,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_ } variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC); - 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(); } @@ -31849,7 +31849,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_ } variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC); - 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(); } @@ -32126,7 +32126,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -32810,7 +32810,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); @@ -32951,7 +32951,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); @@ -33092,7 +33092,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); @@ -33233,7 +33233,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); @@ -33378,7 +33378,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -33503,7 +33503,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -34341,7 +34341,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -35029,7 +35029,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op2); @@ -35170,7 +35170,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -35311,7 +35311,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -35452,7 +35452,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op2); @@ -35597,7 +35597,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -35722,7 +35722,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -37189,7 +37189,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -37873,7 +37873,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); @@ -38014,7 +38014,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); @@ -38155,7 +38155,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); @@ -38296,7 +38296,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); @@ -38441,7 +38441,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -38566,7 +38566,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -41726,7 +41726,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -42999,7 +42999,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); @@ -43140,7 +43140,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); @@ -43281,7 +43281,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); @@ -43422,7 +43422,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); @@ -43973,7 +43973,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -44098,7 +44098,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -46093,7 +46093,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -47248,7 +47248,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op2); @@ -47389,7 +47389,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -47530,7 +47530,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -47671,7 +47671,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op2); @@ -48166,7 +48166,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -48291,7 +48291,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -52155,7 +52155,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -53303,7 +53303,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); @@ -53444,7 +53444,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); @@ -53585,7 +53585,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); @@ -53726,7 +53726,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); @@ -54325,7 +54325,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -54450,7 +54450,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index aaeb8fc4327a..027e47f5caaa 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -573,10 +573,10 @@ $op_data_get_zval_ptr_ptr = array( "ANY" => "get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data, \\1)", "TMP" => "NULL", - "VAR" => "_get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data)", + "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(execute_data, (opline+1)->op1.var)", + "CV" => "_get_zval_ptr_cv_\\1((opline+1)->op1.var EXECUTE_DATA_CC)", "TMPVAR" => "???", "TMPVARCV" => "???", ); diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 812f81ff04e6..20ce0710593a 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -2281,7 +2281,7 @@ static uint32_t zend_fetch_prop_info(const zend_op_array *op_array, zend_ssa *ss ce = ssa->var_info[ssa->ops[i].op1_use].ce; } if (ce) { - prop_info = zend_hash_find_ptr(&ce->properties_info, Z_STR_P(CRT_CONSTANT_EX(op_array, opline->op2, ssa->rt_constants))); + prop_info = zend_hash_find_ptr(&ce->properties_info, Z_STR_P(CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants))); } } diff --git a/ext/standard/file.c b/ext/standard/file.c index c57602bedfb2..8517f3c16755 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -342,11 +342,7 @@ PHP_FUNCTION(flock) Z_PARAM_RESOURCE(res) Z_PARAM_LONG(operation) Z_PARAM_OPTIONAL -<<<<<<< HEAD Z_PARAM_ZVAL(wouldblock) -======= - Z_PARAM_ZVAL_DEREF(wouldblock) ->>>>>>> master ZEND_PARSE_PARAMETERS_END(); PHP_STREAM_TO_ZVAL(stream, res); @@ -358,12 +354,7 @@ PHP_FUNCTION(flock) } if (wouldblock) { -<<<<<<< HEAD ZEND_TRY_ASSIGN_LONG(wouldblock, 0); -======= - zval_ptr_dtor(wouldblock); - ZVAL_LONG(wouldblock, 0); ->>>>>>> master } /* flock_values contains all possible actions if (operation & 4) we won't block on the lock */ diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c index b7e5f1299a77..4f02f0ebf1ee 100644 --- a/ext/standard/var_unserializer.c +++ b/ext/standard/var_unserializer.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.14.3 */ +/* Generated by re2c 1.0.1 */ #line 1 "ext/standard/var_unserializer.re" /* +----------------------------------------------------------------------+ @@ -241,15 +241,11 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx) var_dtor_hash = next; } -<<<<<<< HEAD - zval_ptr_dtor(&wakeup_name); + zval_ptr_dtor_nogc(&wakeup_name); if ((*var_hashx)->refs) { zend_array_destroy((*var_hashx)->refs); } -======= - zval_ptr_dtor_nogc(&wakeup_name); ->>>>>>> master } /* }}} */ @@ -548,7 +544,6 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab return 0; } -<<<<<<< HEAD if (UNEXPECTED(info)) { data = zend_verify_property_type(info, data, &tmp, 1); if (UNEXPECTED(!data)) { @@ -558,21 +553,8 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab ZVAL_COPY(old_data, data); } - if (UNEXPECTED(Z_ISUNDEF_P(data))) { - if (Z_TYPE(key) == IS_LONG) { - zend_hash_index_del(ht, Z_LVAL(key)); - } else { - zend_hash_del_ind(ht, Z_STR(key)); - } - } else { - var_push_dtor(var_hash, data); - } - - zval_dtor(&key); -======= var_push_dtor(var_hash, data); zval_ptr_dtor(&key); ->>>>>>> master if (elements && *(*p-1) != ';' && *(*p-1) != '}') { (*p)--; @@ -659,17 +641,12 @@ static inline int object_common2(UNSERIALIZE_PARAMETER, zend_long elements) && zend_hash_str_exists(&Z_OBJCE_P(rval)->function_table, "__wakeup", sizeof("__wakeup")-1); ht = Z_OBJPROP_P(rval); -<<<<<<< HEAD - zend_hash_extend(ht, zend_hash_num_elements(ht) + elements, (ht->u.flags & HASH_FLAG_PACKED)); - if (!process_nested_data(UNSERIALIZE_PASSTHRU, ht, elements, Z_OBJCE_P(rval))) { -======= if (elements >= (zend_long)(HT_MAX_SIZE - zend_hash_num_elements(ht))) { return 0; } zend_hash_extend(ht, zend_hash_num_elements(ht) + elements, HT_FLAGS(ht) & HASH_FLAG_PACKED); - if (!process_nested_data(UNSERIALIZE_PASSTHRU, ht, elements, 1)) { ->>>>>>> master + if (!process_nested_data(UNSERIALIZE_PASSTHRU, ht, elements, Z_OBJCE_P(rval))) { if (has_wakeup) { ZVAL_DEREF(rval); GC_ADD_FLAGS(Z_OBJ_P(rval), IS_OBJ_DESTRUCTOR_CALLED); @@ -737,11 +714,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) start = cursor; -<<<<<<< HEAD -#line 668 "ext/standard/var_unserializer.c" -======= -#line 672 "ext/standard/var_unserializer.c" ->>>>>>> master +#line 718 "ext/standard/var_unserializer.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -778,127 +751,100 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; - if ((YYLIMIT - YYCURSOR) < 7) YYFILL(7); yych = *YYCURSOR; switch (yych) { case 'C': - case 'O': goto yy13; + case 'O': goto yy4; case 'N': goto yy5; - case 'R': goto yy2; - case 'S': goto yy10; - case 'a': goto yy11; - case 'b': goto yy6; - case 'd': goto yy8; - case 'i': goto yy7; + case 'R': goto yy6; + case 'S': goto yy7; + case 'a': goto yy8; + case 'b': goto yy9; + case 'd': goto yy10; + case 'i': goto yy11; case 'o': goto yy12; - case 'r': goto yy4; - case 's': goto yy9; - case '}': goto yy14; - default: goto yy16; + case 'r': goto yy13; + case 's': goto yy14; + case '}': goto yy15; + default: goto yy2; } yy2: - yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy95; + ++YYCURSOR; yy3: -<<<<<<< HEAD -#line 1045 "ext/standard/var_unserializer.re" - { return 0; } -#line 730 "ext/standard/var_unserializer.c" -======= -#line 1071 "ext/standard/var_unserializer.re" +#line 1117 "ext/standard/var_unserializer.re" { return 0; } -#line 732 "ext/standard/var_unserializer.c" ->>>>>>> master +#line 778 "ext/standard/var_unserializer.c" yy4: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy89; + if (yych == ':') goto yy17; goto yy3; yy5: yych = *++YYCURSOR; - if (yych == ';') goto yy87; + if (yych == ';') goto yy19; goto yy3; yy6: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy83; + if (yych == ':') goto yy21; goto yy3; yy7: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy77; + if (yych == ':') goto yy22; goto yy3; yy8: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy53; + if (yych == ':') goto yy23; goto yy3; yy9: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy46; + if (yych == ':') goto yy24; goto yy3; yy10: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy39; + if (yych == ':') goto yy25; goto yy3; yy11: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy32; + if (yych == ':') goto yy26; goto yy3; yy12: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy25; + if (yych == ':') goto yy27; goto yy3; yy13: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy17; + if (yych == ':') goto yy28; goto yy3; yy14: + yych = *(YYMARKER = ++YYCURSOR); + if (yych == ':') goto yy29; + goto yy3; +yy15: ++YYCURSOR; -<<<<<<< HEAD -#line 1039 "ext/standard/var_unserializer.re" -======= -#line 1065 "ext/standard/var_unserializer.re" ->>>>>>> master +#line 1111 "ext/standard/var_unserializer.re" { /* this is the case where we have less data than planned */ php_error_docref(NULL, E_NOTICE, "Unexpected end of serialized data"); return 0; /* not sure if it should be 0 or 1 here? */ } -<<<<<<< HEAD -#line 779 "ext/standard/var_unserializer.c" -yy16: - yych = *++YYCURSOR; - goto yy3; -yy17: - yych = *++YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy20; - } - if (yych == '+') goto yy19; -======= -#line 785 "ext/standard/var_unserializer.c" +#line 831 "ext/standard/var_unserializer.c" yy17: yych = *++YYCURSOR; if (yybm[0+yych] & 128) { goto yy30; } ->>>>>>> master yy18: YYCURSOR = YYMARKER; goto yy3; yy19: -<<<<<<< HEAD - yych = *++YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy20; - } -======= ++YYCURSOR; -#line 726 "ext/standard/var_unserializer.re" +#line 772 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_NULL(rval); return 1; } -#line 802 "ext/standard/var_unserializer.c" +#line 848 "ext/standard/var_unserializer.c" yy21: yych = *++YYCURSOR; if (yych <= '/') goto yy18; @@ -913,155 +859,10 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) yych = *++YYCURSOR; if (yych <= '/') goto yy18; if (yych <= '9') goto yy36; ->>>>>>> master goto yy18; -yy20: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = *YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy20; - } - if (yych <= '/') goto yy18; -<<<<<<< HEAD - if (yych >= ';') goto yy18; +yy24: yych = *++YYCURSOR; - if (yych != '"') goto yy18; - ++YYCURSOR; -#line 887 "ext/standard/var_unserializer.re" - { - size_t len, len2, len3, maxlen; - zend_long elements; - char *str; - zend_string *class_name; - zend_class_entry *ce; - int incomplete_class = 0; - - int custom_object = 0; - - zval user_func; - zval retval; - zval args[1]; - - if (!var_hash) return 0; - if (*start == 'C') { - custom_object = 1; - } - - len2 = len = parse_uiv(start + 2); - maxlen = max - YYCURSOR; - if (maxlen < len || len == 0) { - *p = start + 2; - return 0; - } - - str = (char*)YYCURSOR; - - YYCURSOR += len; - - if (*(YYCURSOR) != '"') { - *p = YYCURSOR; - return 0; - } - if (*(YYCURSOR+1) != ':') { - *p = YYCURSOR+1; - return 0; - } - - len3 = strspn(str, "0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377\\"); - if (len3 != len) - { - *p = YYCURSOR + len3 - len; - return 0; - } - - class_name = zend_string_init(str, len, 0); - - do { - if(!unserialize_allowed_class(class_name, var_hash)) { - incomplete_class = 1; - ce = PHP_IC_ENTRY; - break; - } - - /* Try to find class directly */ - BG(serialize_lock)++; - ce = zend_lookup_class(class_name); - if (ce) { - BG(serialize_lock)--; - if (EG(exception)) { - zend_string_release(class_name); - return 0; - } - break; - } - BG(serialize_lock)--; - - if (EG(exception)) { - zend_string_release(class_name); - return 0; - } - - /* Check for unserialize callback */ - if ((PG(unserialize_callback_func) == NULL) || (PG(unserialize_callback_func)[0] == '\0')) { - incomplete_class = 1; - ce = PHP_IC_ENTRY; - break; - } - - /* Call unserialize callback */ - ZVAL_STRING(&user_func, PG(unserialize_callback_func)); - - ZVAL_STR_COPY(&args[0], class_name); - BG(serialize_lock)++; - if (call_user_function_ex(CG(function_table), NULL, &user_func, &retval, 1, args, 0, NULL) != SUCCESS) { - BG(serialize_lock)--; - if (EG(exception)) { - zend_string_release(class_name); - zval_ptr_dtor(&user_func); - zval_ptr_dtor(&args[0]); - return 0; - } - php_error_docref(NULL, E_WARNING, "defined (%s) but not found", Z_STRVAL(user_func)); - incomplete_class = 1; - ce = PHP_IC_ENTRY; - zval_ptr_dtor(&user_func); - zval_ptr_dtor(&args[0]); - break; - } - BG(serialize_lock)--; - zval_ptr_dtor(&retval); - if (EG(exception)) { - zend_string_release(class_name); - zval_ptr_dtor(&user_func); - zval_ptr_dtor(&args[0]); - return 0; - } - - /* The callback function may have defined the class */ - BG(serialize_lock)++; - if ((ce = zend_lookup_class(class_name)) == NULL) { - php_error_docref(NULL, E_WARNING, "Function %s() hasn't defined the class it was called for", Z_STRVAL(user_func)); - incomplete_class = 1; - ce = PHP_IC_ENTRY; - } - BG(serialize_lock)--; - - zval_ptr_dtor(&user_func); - zval_ptr_dtor(&args[0]); - break; - } while (1); - - *p = YYCURSOR; - - if (custom_object) { - int ret; - - ret = object_custom(UNSERIALIZE_PASSTHRU, ce); - - if (ret && incomplete_class) { - php_store_class_name(rval, ZSTR_VAL(class_name), len2); -======= + if (yych <= '/') goto yy18; if (yych <= '0') goto yy38; if (yych <= '1') goto yy39; goto yy18; @@ -1084,52 +885,8 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } else { if (yych == 'N') goto yy46; goto yy18; ->>>>>>> master } - zend_string_release(class_name); - return ret; - } -<<<<<<< HEAD - - elements = object_common1(UNSERIALIZE_PASSTHRU, ce); - - if (elements < 0) { - zend_string_release(class_name); - return 0; - } - - if (incomplete_class) { - php_store_class_name(rval, ZSTR_VAL(class_name), len2); } - zend_string_release(class_name); - - return object_common2(UNSERIALIZE_PASSTHRU, elements); -} -#line 962 "ext/standard/var_unserializer.c" -yy25: - yych = *++YYCURSOR; - if (yych <= ',') { - if (yych != '+') goto yy18; - } else { - if (yych <= '-') goto yy26; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy27; - goto yy18; - } -yy26: - yych = *++YYCURSOR; - if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; -yy27: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = *YYCURSOR; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy27; - if (yych >= ';') goto yy18; - yych = *++YYCURSOR; - if (yych != '"') goto yy18; -======= yy26: yych = *++YYCURSOR; if (yych <= ',') { @@ -1167,74 +924,19 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) if (yych <= ':') goto yy56; goto yy18; yy32: ->>>>>>> master ++YYCURSOR; -#line 876 "ext/standard/var_unserializer.re" - { - long elements; - if (!var_hash) return 0; - - elements = object_common1(UNSERIALIZE_PASSTHRU, ZEND_STANDARD_CLASS_DEF_PTR); - if (elements < 0) { - return 0; - } - return object_common2(UNSERIALIZE_PASSTHRU, elements); -} -#line 998 "ext/standard/var_unserializer.c" -yy32: - yych = *++YYCURSOR; - if (yych == '+') goto yy33; - if (yych <= '/') goto yy18; -<<<<<<< HEAD - if (yych <= '9') goto yy34; - goto yy18; -yy33: - yych = *++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; -======= if (yych <= '9') goto yy32; if (yych == ';') goto yy57; goto yy18; ->>>>>>> master yy34: ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if (yych <= '/') goto yy18; if (yych <= '9') goto yy34; -<<<<<<< HEAD - if (yych >= ';') goto yy18; - yych = *++YYCURSOR; - if (yych != '{') goto yy18; - ++YYCURSOR; -#line 852 "ext/standard/var_unserializer.re" - { - zend_long elements = parse_iv(start + 2); - /* use iv() not uiv() in order to check data range */ - *p = YYCURSOR; - if (!var_hash) return 0; - - if (elements < 0) { - return 0; - } - - array_init_size(rval, elements); - if (elements) { - /* we can't convert from packed to hash during unserialization, because - reference to some zvals might be keept in var_hash (to support references) */ - zend_hash_real_init(Z_ARRVAL_P(rval), 0); - } - - if (!process_nested_data(UNSERIALIZE_PASSTHRU, Z_ARRVAL_P(rval), elements, 0)) { - return 0; - } - - return finish_nested_data(UNSERIALIZE_PASSTHRU); -} -#line 1043 "ext/standard/var_unserializer.c" -yy39: -======= if (yych <= ':') goto yy59; goto yy18; yy36: @@ -1305,20 +1007,9 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) if (yych == 'A') goto yy71; goto yy18; yy47: ->>>>>>> master - yych = *++YYCURSOR; - if (yych == '+') goto yy40; - if (yych <= '/') goto yy18; -<<<<<<< HEAD - if (yych <= '9') goto yy41; - goto yy18; -yy40: yych = *++YYCURSOR; if (yych <= '/') goto yy18; if (yych >= ':') goto yy18; -yy41: -======= - if (yych >= ':') goto yy18; yy48: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -1328,88 +1019,26 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) if (yych == ';') goto yy72; goto yy18; yy50: ->>>>>>> master ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if (yych <= '/') goto yy18; -<<<<<<< HEAD - if (yych <= '9') goto yy41; - if (yych >= ';') goto yy18; - yych = *++YYCURSOR; - if (yych != '"') goto yy18; -======= if (yych <= '9') goto yy50; if (yych <= ':') goto yy74; goto yy18; yy52: ->>>>>>> master ++YYCURSOR; -#line 818 "ext/standard/var_unserializer.re" - { - size_t len, maxlen; - zend_string *str; - - len = parse_uiv(start + 2); - maxlen = max - YYCURSOR; - if (maxlen < len) { - *p = start + 2; - return 0; - } - - if ((str = unserialize_str(&YYCURSOR, len, maxlen)) == NULL) { - return 0; - } - - if (*(YYCURSOR) != '"') { - zend_string_free(str); - *p = YYCURSOR; - return 0; - } - - if (*(YYCURSOR + 1) != ';') { - efree(str); - *p = YYCURSOR + 1; - return 0; - } - - YYCURSOR += 2; - *p = YYCURSOR; - - ZVAL_STR(rval, str); - return 1; -} -#line 1098 "ext/standard/var_unserializer.c" -yy46: - yych = *++YYCURSOR; - if (yych == '+') goto yy47; - if (yych <= '/') goto yy18; -<<<<<<< HEAD - if (yych <= '9') goto yy48; - goto yy18; -yy47: - yych = *++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; -yy48: -======= if (yych <= '9') goto yy52; if (yych == ';') goto yy75; goto yy18; yy54: ->>>>>>> master ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if (yych <= '/') goto yy18; -<<<<<<< HEAD - if (yych <= '9') goto yy48; - if (yych >= ';') goto yy18; - yych = *++YYCURSOR; - if (yych != '"') goto yy18; - ++YYCURSOR; -#line 786 "ext/standard/var_unserializer.re" -======= if (yych <= '9') goto yy54; if (yych <= ':') goto yy77; goto yy18; @@ -1419,33 +1048,13 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy18; yy57: ++YYCURSOR; -#line 676 "ext/standard/var_unserializer.re" ->>>>>>> master +#line 722 "ext/standard/var_unserializer.re" { - size_t len, maxlen; - char *str; - -<<<<<<< HEAD - len = parse_uiv(start + 2); - maxlen = max - YYCURSOR; - if (maxlen < len) { - *p = start + 2; - return 0; - } - - str = (char*)YYCURSOR; - - YYCURSOR += len; + zend_long id; - if (*(YYCURSOR) != '"') { - *p = YYCURSOR; - return 0; - } + *p = YYCURSOR; + if (!var_hash) return 0; - if (*(YYCURSOR + 1) != ';') { - *p = YYCURSOR + 1; - return 0; -======= id = parse_uiv(start + 2) - 1; if (id == -1 || (rval_ref = var_access(var_hash, id)) == NULL) { return 0; @@ -1460,88 +1069,11 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } else { ZVAL_NEW_REF(rval_ref, rval_ref); ZVAL_COPY(rval, rval_ref); ->>>>>>> master } - YYCURSOR += 2; - *p = YYCURSOR; - - ZVAL_STRINGL(rval, str, len); return 1; } -<<<<<<< HEAD -#line 1151 "ext/standard/var_unserializer.c" -yy53: - yych = *++YYCURSOR; - if (yych <= '/') { - if (yych <= ',') { - if (yych == '+') goto yy57; - goto yy18; - } else { - if (yych <= '-') goto yy55; - if (yych <= '.') goto yy60; - goto yy18; - } - } else { - if (yych <= 'I') { - if (yych <= '9') goto yy58; - if (yych <= 'H') goto yy18; - goto yy56; - } else { - if (yych != 'N') goto yy18; - } - } - yych = *++YYCURSOR; - if (yych == 'A') goto yy76; - goto yy18; -yy55: - yych = *++YYCURSOR; - if (yych <= '/') { - if (yych == '.') goto yy60; - goto yy18; - } else { - if (yych <= '9') goto yy58; - if (yych != 'I') goto yy18; - } -yy56: - yych = *++YYCURSOR; - if (yych == 'N') goto yy72; - goto yy18; -yy57: - yych = *++YYCURSOR; - if (yych == '.') goto yy60; - if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; -yy58: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4); - yych = *YYCURSOR; - if (yych <= ':') { - if (yych <= '.') { - if (yych <= '-') goto yy18; - goto yy70; - } else { - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy58; - goto yy18; - } - } else { - if (yych <= 'E') { - if (yych <= ';') goto yy63; - if (yych <= 'D') goto yy18; - goto yy65; - } else { - if (yych == 'e') goto yy65; - goto yy18; - } - } -yy60: - yych = *++YYCURSOR; - if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; -yy61: -======= -#line 1031 "ext/standard/var_unserializer.c" +#line 1077 "ext/standard/var_unserializer.c" yy59: yych = *++YYCURSOR; if (yych == '"') goto yy80; @@ -1552,49 +1084,33 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy18; yy61: ++YYCURSOR; -#line 732 "ext/standard/var_unserializer.re" +#line 778 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_FALSE(rval); return 1; } -#line 1048 "ext/standard/var_unserializer.c" +#line 1094 "ext/standard/var_unserializer.c" yy63: ->>>>>>> master ++YYCURSOR; -#line 738 "ext/standard/var_unserializer.re" +#line 784 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_TRUE(rval); return 1; } -#line 1057 "ext/standard/var_unserializer.c" +#line 1103 "ext/standard/var_unserializer.c" yy65: ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); yych = *YYCURSOR; if (yych <= ';') { if (yych <= '/') goto yy18; -<<<<<<< HEAD - if (yych <= '9') goto yy61; -======= if (yych <= '9') goto yy65; ->>>>>>> master if (yych <= ':') goto yy18; } else { if (yych <= 'E') { if (yych <= 'D') goto yy18; -<<<<<<< HEAD - goto yy65; - } else { - if (yych == 'e') goto yy65; - goto yy18; - } - } -yy63: - ++YYCURSOR; -#line 777 "ext/standard/var_unserializer.re" -======= goto yy69; } else { if (yych == 'e') goto yy69; @@ -1603,8 +1119,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } yy67: ++YYCURSOR; -#line 786 "ext/standard/var_unserializer.re" ->>>>>>> master +#line 832 "ext/standard/var_unserializer.re" { #if SIZEOF_ZEND_LONG == 4 use_double: @@ -1613,56 +1128,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) ZVAL_DOUBLE(rval, zend_strtod((const char *)start + 2, NULL)); return 1; } -<<<<<<< HEAD -#line 1248 "ext/standard/var_unserializer.c" -yy65: - yych = *++YYCURSOR; - if (yych <= ',') { - if (yych != '+') goto yy18; - } else { - if (yych <= '-') goto yy66; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy67; - goto yy18; - } -yy66: - yych = *++YYCURSOR; - if (yych <= ',') { - if (yych == '+') goto yy69; - goto yy18; - } else { - if (yych <= '-') goto yy69; - if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; - } -yy67: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy67; - if (yych == ';') goto yy63; - goto yy18; -yy69: - yych = *++YYCURSOR; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy67; - goto yy18; -yy70: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4); - yych = *YYCURSOR; - if (yych <= ';') { - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy70; - if (yych <= ':') goto yy18; - goto yy63; - } else { - if (yych <= 'E') { - if (yych <= 'D') goto yy18; - goto yy65; -======= -#line 1086 "ext/standard/var_unserializer.c" +#line 1132 "ext/standard/var_unserializer.c" yy69: yych = *++YYCURSOR; if (yych <= ',') { @@ -1684,7 +1150,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy18; yy72: ++YYCURSOR; -#line 744 "ext/standard/var_unserializer.re" +#line 790 "ext/standard/var_unserializer.re" { #if SIZEOF_ZEND_LONG == 4 int digits = YYCURSOR - start - 3; @@ -1701,46 +1167,23 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) if (!(cmp < 0 || (cmp == 0 && start[2] == '-'))) { goto use_double; } ->>>>>>> master } else { - if (yych == 'e') goto yy65; - goto yy18; + goto use_double; } } -<<<<<<< HEAD -yy72: - yych = *++YYCURSOR; - if (yych != 'F') goto yy18; -yy73: - yych = *++YYCURSOR; - if (yych != ';') goto yy18; - ++YYCURSOR; -#line 761 "ext/standard/var_unserializer.re" - { - *p = YYCURSOR; - - if (!strncmp((char*)start + 2, "NAN", 3)) { - ZVAL_DOUBLE(rval, ZEND_NAN); - } else if (!strncmp((char*)start + 2, "INF", 3)) { - ZVAL_DOUBLE(rval, ZEND_INFINITY); - } else if (!strncmp((char*)start + 2, "-INF", 4)) { - ZVAL_DOUBLE(rval, -ZEND_INFINITY); - } else { - ZVAL_NULL(rval); -======= #endif *p = YYCURSOR; ZVAL_LONG(rval, parse_iv(start + 2)); return 1; } -#line 1134 "ext/standard/var_unserializer.c" +#line 1180 "ext/standard/var_unserializer.c" yy74: yych = *++YYCURSOR; if (yych == '"') goto yy88; goto yy18; yy75: ++YYCURSOR; -#line 701 "ext/standard/var_unserializer.re" +#line 747 "ext/standard/var_unserializer.re" { zend_long id; @@ -1759,87 +1202,66 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) ZVAL_DEREF(rval_ref); if (Z_TYPE_P(rval_ref) != IS_OBJECT) { return 0; ->>>>>>> master } + ZVAL_COPY(rval, rval_ref); + return 1; } -<<<<<<< HEAD -#line 1323 "ext/standard/var_unserializer.c" -yy76: - yych = *++YYCURSOR; - if (yych == 'N') goto yy73; - goto yy18; -yy77: - yych = *++YYCURSOR; - if (yych <= ',') { - if (yych != '+') goto yy18; - } else { - if (yych <= '-') goto yy78; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy79; - goto yy18; - } -yy78: - yych = *++YYCURSOR; - if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; -yy79: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy79; - if (yych != ';') goto yy18; - ++YYCURSOR; -#line 735 "ext/standard/var_unserializer.re" -======= -#line 1166 "ext/standard/var_unserializer.c" +#line 1212 "ext/standard/var_unserializer.c" yy77: yych = *++YYCURSOR; if (yych == '"') goto yy90; goto yy18; yy78: ++YYCURSOR; -#line 913 "ext/standard/var_unserializer.re" ->>>>>>> master +#line 959 "ext/standard/var_unserializer.re" { -#if SIZEOF_ZEND_LONG == 4 - int digits = YYCURSOR - start - 3; + size_t len, len2, len3, maxlen; + zend_long elements; + char *str; + zend_string *class_name; + zend_class_entry *ce; + int incomplete_class = 0; - if (start[2] == '-' || start[2] == '+') { - digits--; + int custom_object = 0; + + zval user_func; + zval retval; + zval args[1]; + + if (!var_hash) return 0; + if (*start == 'C') { + custom_object = 1; } -<<<<<<< HEAD - /* Use double for large zend_long values that were serialized on a 64-bit system */ - if (digits >= MAX_LENGTH_OF_LONG - 1) { - if (digits == MAX_LENGTH_OF_LONG - 1) { - int cmp = strncmp((char*)YYCURSOR - MAX_LENGTH_OF_LONG, long_min_digits, MAX_LENGTH_OF_LONG - 1); + len2 = len = parse_uiv(start + 2); + maxlen = max - YYCURSOR; + if (maxlen < len || len == 0) { + *p = start + 2; + return 0; + } - if (!(cmp < 0 || (cmp == 0 && start[2] == '-'))) { - goto use_double; - } - } else { - goto use_double; - } + str = (char*)YYCURSOR; + + YYCURSOR += len; + + if (*(YYCURSOR) != '"') { + *p = YYCURSOR; + return 0; } -#endif - *p = YYCURSOR; - ZVAL_LONG(rval, parse_iv(start + 2)); - return 1; -} -#line 1376 "ext/standard/var_unserializer.c" -yy83: - yych = *++YYCURSOR; - if (yych <= '/') goto yy18; - if (yych >= '2') goto yy18; - yych = *++YYCURSOR; - if (yych != ';') goto yy18; - ++YYCURSOR; -#line 729 "ext/standard/var_unserializer.re" + if (*(YYCURSOR+1) != ':') { + *p = YYCURSOR+1; + return 0; + } + + len3 = strspn(str, "0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377\\"); + if (len3 != len) { -======= + *p = YYCURSOR + len3 - len; + return 0; + } + class_name = zend_string_init(str, len, 0); do { @@ -1945,10 +1367,10 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) return object_common2(UNSERIALIZE_PASSTHRU, elements); } -#line 1325 "ext/standard/var_unserializer.c" +#line 1371 "ext/standard/var_unserializer.c" yy80: ++YYCURSOR; -#line 835 "ext/standard/var_unserializer.re" +#line 881 "ext/standard/var_unserializer.re" { size_t len, maxlen; zend_string *str; @@ -1977,45 +1399,19 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } YYCURSOR += 2; ->>>>>>> master *p = YYCURSOR; - ZVAL_BOOL(rval, parse_iv(start + 2)); + + ZVAL_STR(rval, str); return 1; } -<<<<<<< HEAD -#line 1390 "ext/standard/var_unserializer.c" -yy87: - ++YYCURSOR; -#line 723 "ext/standard/var_unserializer.re" -======= -#line 1362 "ext/standard/var_unserializer.c" +#line 1408 "ext/standard/var_unserializer.c" yy82: ++YYCURSOR; -#line 869 "ext/standard/var_unserializer.re" ->>>>>>> master +#line 915 "ext/standard/var_unserializer.re" { + zend_long elements = parse_iv(start + 2); + /* use iv() not uiv() in order to check data range */ *p = YYCURSOR; -<<<<<<< HEAD - ZVAL_NULL(rval); - return 1; -} -#line 1399 "ext/standard/var_unserializer.c" -yy89: - yych = *++YYCURSOR; - if (yych <= ',') { - if (yych != '+') goto yy18; - } else { - if (yych <= '-') goto yy90; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy91; - goto yy18; - } -yy90: - yych = *++YYCURSOR; - if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; -yy91: -======= if (!var_hash) return 0; if (elements < 0 || elements >= HT_MAX_SIZE) { @@ -2044,28 +1440,16 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) return finish_nested_data(UNSERIALIZE_PASSTHRU); } -#line 1398 "ext/standard/var_unserializer.c" +#line 1444 "ext/standard/var_unserializer.c" yy84: yych = *++YYCURSOR; if (yych <= '/') goto yy18; if (yych >= ':') goto yy18; yy85: ->>>>>>> master ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; if (yych <= '/') goto yy18; -<<<<<<< HEAD - if (yych <= '9') goto yy91; - if (yych != ';') goto yy18; - ++YYCURSOR; -#line 698 "ext/standard/var_unserializer.re" - { - zend_long id; - - *p = YYCURSOR; - if (!var_hash) return 0; -======= if (yych <= '9') goto yy85; if (yych == ';') goto yy67; goto yy18; @@ -2075,7 +1459,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy18; yy88: ++YYCURSOR; -#line 902 "ext/standard/var_unserializer.re" +#line 948 "ext/standard/var_unserializer.re" { zend_long elements; if (!var_hash) return 0; @@ -2086,59 +1470,38 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } return object_common2(UNSERIALIZE_PASSTHRU, elements); } -#line 1428 "ext/standard/var_unserializer.c" +#line 1474 "ext/standard/var_unserializer.c" yy90: ++YYCURSOR; -#line 795 "ext/standard/var_unserializer.re" +#line 841 "ext/standard/var_unserializer.re" { size_t len, maxlen; char *str; ->>>>>>> master - id = parse_iv(start + 2) - 1; - if (id == -1 || (rval_ref = var_access(var_hash, id)) == NULL) { + len = parse_uiv(start + 2); + maxlen = max - YYCURSOR; + if (maxlen < len) { + *p = start + 2; return 0; } - if (rval_ref == rval) { + str = (char*)YYCURSOR; + + YYCURSOR += len; + + if (*(YYCURSOR) != '"') { + *p = YYCURSOR; return 0; } - if (Z_ISUNDEF_P(rval_ref) || (Z_ISREF_P(rval_ref) && Z_ISUNDEF_P(Z_REFVAL_P(rval_ref)))) { - ZVAL_UNDEF(rval); - return 1; + if (*(YYCURSOR + 1) != ';') { + *p = YYCURSOR + 1; + return 0; } - ZVAL_COPY(rval, rval_ref); + YYCURSOR += 2; + *p = YYCURSOR; -<<<<<<< HEAD - return 1; -} -#line 1447 "ext/standard/var_unserializer.c" -yy95: - yych = *++YYCURSOR; - if (yych <= ',') { - if (yych != '+') goto yy18; - } else { - if (yych <= '-') goto yy96; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy97; - goto yy18; - } -yy96: - yych = *++YYCURSOR; - if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; -yy97: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy97; - if (yych != ';') goto yy18; - ++YYCURSOR; -#line 672 "ext/standard/var_unserializer.re" -======= if (len == 0) { ZVAL_EMPTY_STRING(rval); } else if (len == 1) { @@ -2150,45 +1513,28 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } return 1; } -#line 1471 "ext/standard/var_unserializer.c" +#line 1517 "ext/standard/var_unserializer.c" yy92: ++YYCURSOR; -#line 770 "ext/standard/var_unserializer.re" ->>>>>>> master +#line 816 "ext/standard/var_unserializer.re" { - zend_long id; - - *p = YYCURSOR; - if (!var_hash) return 0; - - id = parse_iv(start + 2) - 1; - if (id == -1 || (rval_ref = var_access(var_hash, id)) == NULL) { - return 0; - } + *p = YYCURSOR; - zval_ptr_dtor(rval); - if (Z_ISUNDEF_P(rval_ref) || (Z_ISREF_P(rval_ref) && Z_ISUNDEF_P(Z_REFVAL_P(rval_ref)))) { - ZVAL_UNDEF(rval); - return 1; - } - if (Z_ISREF_P(rval_ref)) { - ZVAL_COPY(rval, rval_ref); + if (!strncmp((char*)start + 2, "NAN", 3)) { + ZVAL_DOUBLE(rval, ZEND_NAN); + } else if (!strncmp((char*)start + 2, "INF", 3)) { + ZVAL_DOUBLE(rval, ZEND_INFINITY); + } else if (!strncmp((char*)start + 2, "-INF", 4)) { + ZVAL_DOUBLE(rval, -ZEND_INFINITY); } else { - ZVAL_NEW_REF(rval_ref, rval_ref); - ZVAL_COPY(rval, rval_ref); + ZVAL_NULL(rval); } return 1; } -<<<<<<< HEAD -#line 1496 "ext/standard/var_unserializer.c" -} -#line 1047 "ext/standard/var_unserializer.re" -======= -#line 1490 "ext/standard/var_unserializer.c" +#line 1536 "ext/standard/var_unserializer.c" } -#line 1073 "ext/standard/var_unserializer.re" ->>>>>>> master +#line 1119 "ext/standard/var_unserializer.re" return 0; From f42495d9ba81fa8516be6afaa28e8bba8ef88a00 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 7 Jun 2018 00:57:20 +0200 Subject: [PATCH 226/369] Initial ref type in MAKE_REF_EX --- Zend/zend_types.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 62bee89b3963..5d1abceb45f0 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -895,6 +895,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->type = 0; \ Z_REF_P(_z) = _ref; \ Z_TYPE_INFO_P(_z) = IS_REFERENCE_EX; \ } while (0) From ed00f11ad5c6d6e83c1fb2b4286208427bd80026 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 7 Jun 2018 12:35:56 +0200 Subject: [PATCH 227/369] Solve the clashing FETCH_REF|CACHE_SLOT --- Zend/zend_execute.c | 5 +- Zend/zend_vm_def.h | 8 ++- Zend/zend_vm_execute.h | 114 ++++++++++++++++------------------------- 3 files changed, 50 insertions(+), 77 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 75cd475319f0..75bf31986800 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2476,12 +2476,11 @@ static zend_never_inline int ZEND_FASTCALL zend_isempty_dim_slow(zval *container } } -/* TODO(typed_refs) Can we use OPLINE_DC instead of passing by_ref? */ 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 by_ref OPLINE_DC) { zval *ptr; - if (container_op_type != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { + if (container_op_type != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { do { if (Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -2508,7 +2507,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (EXPECTED(Z_TYPE_P(ptr) != IS_UNDEF)) { return_indirect: ZVAL_INDIRECT(result, ptr); - if ((by_ref & ZEND_FETCH_REF) + if (by_ref && (prop_op_type == IS_CONST || EXPECTED(Z_TYPE_P(prop_ptr) == IS_STRING)) && Z_TYPE_P(ptr) != IS_REFERENCE) { zend_property_info *prop_info; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 9114a9689c06..cae733058276 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2126,7 +2126,6 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|CACHE_SLOT) { USE_OPLINE @@ -2142,7 +2141,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH 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->extended_value OPLINE_CC); + zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); FREE_OP2(); if (OP1_TYPE == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -2267,7 +2266,6 @@ ZEND_VM_C_LABEL(fetch_obj_is_no_object): ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ ZEND_VM_COLD_CONST_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|CACHE_SLOT) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -2687,7 +2685,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S cache_addr = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, OP1_TYPE, property, OP2_TYPE, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, OP1_TYPE, property, OP2_TYPE, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -2706,7 +2704,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S } else { variable_ptr = Z_INDIRECT(variable); - if ((OP2_TYPE == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((OP2_TYPE == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (OP2_TYPE == IS_CONST) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 448b24afa300..901009b7b37a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4810,7 +4810,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -4905,7 +4904,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -6897,7 +6895,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -6993,7 +6990,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -9968,7 +9964,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -10063,7 +10058,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -13626,7 +13620,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -13721,7 +13714,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -15213,7 +15205,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -15309,7 +15300,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVA ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -17076,7 +17066,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HAN ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -17171,7 +17160,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HA ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -22826,7 +22814,7 @@ 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->extended_value OPLINE_CC); + zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -23924,7 +23912,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -23943,7 +23931,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CONST == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CONST == IS_CONST) { @@ -24050,7 +24038,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -24069,7 +24057,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CONST == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CONST == IS_CONST) { @@ -25621,7 +25609,7 @@ 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->extended_value 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_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -26664,7 +26652,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -26683,7 +26671,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } else { variable_ptr = Z_INDIRECT(variable); - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -26790,7 +26778,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -26809,7 +26797,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } else { variable_ptr = Z_INDIRECT(variable); - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -29871,7 +29859,7 @@ 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->extended_value OPLINE_CC); + zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -31018,7 +31006,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -31037,7 +31025,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CV == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CV == IS_CONST) { @@ -31144,7 +31132,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -31163,7 +31151,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CV == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CV == IS_CONST) { @@ -32587,7 +32575,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_U ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -32603,7 +32590,7 @@ 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->extended_value OPLINE_CC); + zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -32727,7 +32714,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -33367,7 +33353,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -33386,7 +33372,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CONST == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CONST == IS_CONST) { @@ -33492,7 +33478,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -33511,7 +33497,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CONST == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CONST == IS_CONST) { @@ -34805,7 +34791,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -34821,7 +34806,7 @@ 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->extended_value 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_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -34946,7 +34931,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVA ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -35586,7 +35570,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -35605,7 +35589,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } else { variable_ptr = Z_INDIRECT(variable); - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -35711,7 +35695,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -35730,7 +35714,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } else { variable_ptr = Z_INDIRECT(variable); - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -37650,7 +37634,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -37666,7 +37649,7 @@ 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->extended_value OPLINE_CC); + zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -37790,7 +37773,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HA ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -38430,7 +38412,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -38449,7 +38431,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CV == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CV == IS_CONST) { @@ -38555,7 +38537,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -38574,7 +38556,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CV == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CV == IS_CONST) { @@ -42753,7 +42735,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_C ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -42769,7 +42750,7 @@ 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->extended_value OPLINE_CC); + zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -42893,7 +42874,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HAN ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -43962,7 +43942,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -43981,7 +43961,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CONST == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CONST == IS_CONST) { @@ -44087,7 +44067,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -44106,7 +44086,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CONST == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CONST == IS_CONST) { @@ -47000,7 +46980,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -47016,7 +46995,7 @@ 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->extended_value 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_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -47141,7 +47120,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HA ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -48155,7 +48133,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -48174,7 +48152,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } else { variable_ptr = Z_INDIRECT(variable); - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -48280,7 +48258,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -48299,7 +48277,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } else { variable_ptr = Z_INDIRECT(variable); - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -53057,7 +53035,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -53073,7 +53050,7 @@ 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->extended_value OPLINE_CC); + zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -53197,7 +53174,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLE ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -54314,7 +54290,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -54333,7 +54309,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CV == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CV == IS_CONST) { @@ -54439,7 +54415,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -54458,7 +54434,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CV == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CV == IS_CONST) { From 6709fbb5114ba806e6dca72579c515010edb9fda Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 7 Jun 2018 20:05:41 +0200 Subject: [PATCH 228/369] Fix few tests --- .../typed_properties_004.phpt | 2 +- .../typed_properties_006.phpt | 2 +- .../typed_properties_008.phpt | 2 +- .../typed_properties_013.phpt | 2 +- .../typed_properties_019.phpt | 2 +- .../typed_properties_029.phpt | 2 +- .../typed_properties_030.phpt | 2 +- .../typed_properties_033.phpt | 2 +- .../typed_properties_034.phpt | 4 ++-- .../typed_properties_037.phpt | 2 +- .../typed_properties_038.phpt | 8 +++---- .../typed_properties_039.phpt | 2 +- .../typed_properties_040.phpt | 2 +- .../typed_properties_044.phpt | 4 ++-- .../typed_properties_045.phpt | 2 +- .../typed_properties_046.phpt | 12 +++++----- .../typed_properties_047.phpt | 2 +- .../typed_properties_048.phpt | 2 +- .../typed_properties_049.phpt | 2 +- .../typed_properties_055.phpt | 2 +- .../typed_properties_056.phpt | 2 +- .../typed_properties_057.phpt | 4 ++-- .../typed_properties_058.phpt | 4 ++-- .../typed_properties_059.phpt | 4 ++-- .../typed_properties_060.phpt | 2 +- .../typed_properties_061.phpt | 6 ++--- .../typed_properties_062.phpt | 8 +++---- .../typed_properties_063.phpt | 8 +++---- .../typed_properties_064.phpt | 8 +++---- .../typed_properties_065.phpt | 6 ++--- Zend/zend_compile.c | 3 +-- Zend/zend_compile.h | 3 +-- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 24 +++++++++---------- 34 files changed, 71 insertions(+), 73 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_004.phpt b/Zend/tests/type_declarations/typed_properties_004.phpt index 1d9e6400e00f..bb0314583bc7 100644 --- a/Zend/tests/type_declarations/typed_properties_004.phpt +++ b/Zend/tests/type_declarations/typed_properties_004.phpt @@ -11,7 +11,7 @@ new class("PHP 7 is better than you, and it knows it ...") { }; ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property class@anonymous::$int must be integer, string used in %s:6 +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} diff --git a/Zend/tests/type_declarations/typed_properties_006.phpt b/Zend/tests/type_declarations/typed_properties_006.phpt index 2e775395c43e..3b0165ac5573 100644 --- a/Zend/tests/type_declarations/typed_properties_006.phpt +++ b/Zend/tests/type_declarations/typed_properties_006.phpt @@ -11,5 +11,5 @@ class Bar extends Foo { } ?> --EXPECTF-- -Fatal error: Type of Bar::$qux must be integer (as in class Foo) in %s on line 8 +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_008.phpt b/Zend/tests/type_declarations/typed_properties_008.phpt index 0efff906fa83..b8c37c714746 100644 --- a/Zend/tests/type_declarations/typed_properties_008.phpt +++ b/Zend/tests/type_declarations/typed_properties_008.phpt @@ -11,6 +11,6 @@ class Bar extends Foo { } ?> --EXPECTF-- -Fatal error: Type of Bar::$qux must be integer (as in class Foo) in %s on line 8 +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_013.phpt b/Zend/tests/type_declarations/typed_properties_013.phpt index 177200ada7e3..e6b4751f3a46 100644 --- a/Zend/tests/type_declarations/typed_properties_013.phpt +++ b/Zend/tests/type_declarations/typed_properties_013.phpt @@ -7,7 +7,7 @@ class Foo { } ?> --EXPECTF-- -Fatal error: Default value for properties with integer type can only be integer in %s on line 3 +Fatal error: Default value for properties with int type can only be int in %s on line 3 diff --git a/Zend/tests/type_declarations/typed_properties_019.phpt b/Zend/tests/type_declarations/typed_properties_019.phpt index e9149e1c1c79..0a11b98989da 100644 --- a/Zend/tests/type_declarations/typed_properties_019.phpt +++ b/Zend/tests/type_declarations/typed_properties_019.phpt @@ -15,7 +15,7 @@ $foo = new Foo(); var_dump($foo->inc()); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Foo::$bar must be integer, float used in %s:6 +Fatal error: Uncaught TypeError: Typed property Foo::$bar must be int, float used in %s:6 Stack trace: #0 %s(12): Foo->inc() #1 {main} diff --git a/Zend/tests/type_declarations/typed_properties_029.phpt b/Zend/tests/type_declarations/typed_properties_029.phpt index 9e27d74d97bd..a5418c91a85c 100644 --- a/Zend/tests/type_declarations/typed_properties_029.phpt +++ b/Zend/tests/type_declarations/typed_properties_029.phpt @@ -12,7 +12,7 @@ $foo = new Foo; $foo->bar = "1"; ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Foo::$bar must be integer, string used in %s:9 +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 index 2749948a6839..a835ae5fae79 100644 --- a/Zend/tests/type_declarations/typed_properties_030.phpt +++ b/Zend/tests/type_declarations/typed_properties_030.phpt @@ -19,7 +19,7 @@ unset($foo->bar); # ok var_dump($foo->bar); # not okay, __get is nasty ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Foo::$bar must be integer, string used in %s:16 +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_033.phpt b/Zend/tests/type_declarations/typed_properties_033.phpt index d40df54b1e37..7ab7afec8ec2 100644 --- a/Zend/tests/type_declarations/typed_properties_033.phpt +++ b/Zend/tests/type_declarations/typed_properties_033.phpt @@ -25,7 +25,7 @@ try { var_dump($foo); ?> --EXPECTF-- -Cannot assign float to reference of type integer +Cannot assign float to reference of type int object(class@anonymous)#1 (4) { ["foo"]=> int(2) diff --git a/Zend/tests/type_declarations/typed_properties_034.phpt b/Zend/tests/type_declarations/typed_properties_034.phpt index 99f9e3b59206..e6cb2ad271d6 100644 --- a/Zend/tests/type_declarations/typed_properties_034.phpt +++ b/Zend/tests/type_declarations/typed_properties_034.phpt @@ -38,11 +38,11 @@ var_dump($foo); ?> --EXPECTF-- int(42) -Cannot assign null to reference of type integer +Cannot assign null to reference of type int int(1) int(10) int(10) -Cannot assign null to reference of type integer +Cannot assign null to reference of type int object(class@anonymous)#1 (2) { ["bar"]=> &int(10) diff --git a/Zend/tests/type_declarations/typed_properties_037.phpt b/Zend/tests/type_declarations/typed_properties_037.phpt index 8bdd6748b2e9..ed0869af30aa 100644 --- a/Zend/tests/type_declarations/typed_properties_037.phpt +++ b/Zend/tests/type_declarations/typed_properties_037.phpt @@ -12,6 +12,6 @@ object(class@anonymous)#%d (%d) { ["bar"]=> int(10) ["qux"]=> - uninitialized(integer) + uninitialized(int) } diff --git a/Zend/tests/type_declarations/typed_properties_038.phpt b/Zend/tests/type_declarations/typed_properties_038.phpt index d25d2fc1a906..49e0fa93af7e 100644 --- a/Zend/tests/type_declarations/typed_properties_038.phpt +++ b/Zend/tests/type_declarations/typed_properties_038.phpt @@ -39,22 +39,22 @@ try { var_dump($foo); --EXPECTF-- -string(64) "Typed property class@anonymous::$bar must be integer, float used" +string(60) "Typed property class@anonymous::$bar must be int, float used" object(class@anonymous)#%d (%d) { ["bar"]=> int(%d) } -string(64) "Typed property class@anonymous::$bar must be integer, float used" +string(60) "Typed property class@anonymous::$bar must be int, float used" object(class@anonymous)#%d (%d) { ["bar"]=> int(%d) } -string(64) "Typed property class@anonymous::$bar must be integer, float used" +string(60) "Typed property class@anonymous::$bar must be int, float used" object(class@anonymous)#%d (%d) { ["bar"]=> int(%d) } -string(64) "Typed property class@anonymous::$bar must be integer, float used" +string(60) "Typed property class@anonymous::$bar must be int, float used" object(class@anonymous)#%d (%d) { ["bar"]=> int(%d) diff --git a/Zend/tests/type_declarations/typed_properties_039.phpt b/Zend/tests/type_declarations/typed_properties_039.phpt index 2b2513bd925b..62413d804c19 100644 --- a/Zend/tests/type_declarations/typed_properties_039.phpt +++ b/Zend/tests/type_declarations/typed_properties_039.phpt @@ -25,7 +25,7 @@ var_dump($objs); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property A::$foo must be integer, A used in %s:%d +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 index 075fbb1eacfa..e2927eea8682 100644 --- a/Zend/tests/type_declarations/typed_properties_040.phpt +++ b/Zend/tests/type_declarations/typed_properties_040.phpt @@ -19,7 +19,7 @@ var_dump($foo->bar); --EXPECTF-- string(3) "bar" -Fatal error: Uncaught TypeError: Typed property Foo::$bar must be integer, null used in %s:14 +Fatal error: Uncaught TypeError: Typed property Foo::$bar must be int, null used in %s:14 Stack trace: #0 {main} thrown in %s on line 14 diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt index 490c6ff85913..2fe689d95f07 100644 --- a/Zend/tests/type_declarations/typed_properties_044.phpt +++ b/Zend/tests/type_declarations/typed_properties_044.phpt @@ -43,7 +43,7 @@ int(0) int(-2) int(-1) int(-1) -Cannot assign float to reference of type ?integer -Cannot assign float to reference of type ?integer +Cannot assign float to reference of type ?int +Cannot assign float to reference of type ?int int(-9223372036854775808) int(-9223372036854775808) diff --git a/Zend/tests/type_declarations/typed_properties_045.phpt b/Zend/tests/type_declarations/typed_properties_045.phpt index a70eaf198ae8..830bbb121cb2 100644 --- a/Zend/tests/type_declarations/typed_properties_045.phpt +++ b/Zend/tests/type_declarations/typed_properties_045.phpt @@ -24,7 +24,7 @@ foreach ($foo = new Foo as $k => &$val) { --EXPECT-- int(0) int(20) -Cannot assign array to reference of type integer +Cannot assign array to reference of type int float(0.5) float(20) Cannot assign array to reference of type float diff --git a/Zend/tests/type_declarations/typed_properties_046.phpt b/Zend/tests/type_declarations/typed_properties_046.phpt index 8c160a98e75b..050e64a2a4ed 100644 --- a/Zend/tests/type_declarations/typed_properties_046.phpt +++ b/Zend/tests/type_declarations/typed_properties_046.phpt @@ -1,5 +1,5 @@ --TEST-- -Memory leaks on wrong assignment to typed roperty +Memory leaks on wrong assignment to typed property --FILE-- --EXPECTF-- -Fatal error: Default value for properties with integer type can only be integer in %styped_properties_049.php on line 3 +Fatal error: Default value for properties with int type can only be int in %styped_properties_049.php on line 3 diff --git a/Zend/tests/type_declarations/typed_properties_055.phpt b/Zend/tests/type_declarations/typed_properties_055.phpt index 24ad1f6f9145..fd4921e07892 100644 --- a/Zend/tests/type_declarations/typed_properties_055.phpt +++ b/Zend/tests/type_declarations/typed_properties_055.phpt @@ -22,7 +22,7 @@ $f($o->a->bar); int(1) int(2) -Fatal error: Uncaught TypeError: Cannot assign string to reference of type integer in %s:%d +Fatal error: Uncaught TypeError: Cannot assign string to reference of type int in %s:%d Stack trace: #0 %s(%d): {closure}(2) #1 {main} diff --git a/Zend/tests/type_declarations/typed_properties_056.phpt b/Zend/tests/type_declarations/typed_properties_056.phpt index 4fc7b014b2a9..54013f44f229 100644 --- a/Zend/tests/type_declarations/typed_properties_056.phpt +++ b/Zend/tests/type_declarations/typed_properties_056.phpt @@ -19,5 +19,5 @@ var_dump($o->foo); unset($o); ?> --EXPECT-- -Typed property A::$foo must be string, integer used +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 index fefe8d0738d7..6b53a42600a6 100644 --- a/Zend/tests/type_declarations/typed_properties_057.phpt +++ b/Zend/tests/type_declarations/typed_properties_057.phpt @@ -25,7 +25,7 @@ var_dump($o->foo); unset($o); ?> --EXPECT-- -Typed property A::$foo must be string, integer used +Typed property A::$foo must be string, int used string(3) "100" -Typed property A::$foo must be string, integer used +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 index 2be5aa7aba8d..007fbd3d0b5d 100644 --- a/Zend/tests/type_declarations/typed_properties_058.phpt +++ b/Zend/tests/type_declarations/typed_properties_058.phpt @@ -32,6 +32,6 @@ for ($i = 0; $i < 2; $i++) { ?> --EXPECT-- int(5) -Typed property B::$foo must be string, integer used -Typed property B::$foo must be string, integer used +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 index e0c6d4d5ad27..f54b3df278e1 100644 --- a/Zend/tests/type_declarations/typed_properties_059.phpt +++ b/Zend/tests/type_declarations/typed_properties_059.phpt @@ -19,11 +19,11 @@ var_dump($x); --EXPECT-- object(A)#1 (2) { ["a2"]=> - uninitialized(integer) + uninitialized(int) ["b2"]=> NULL ["a1"]=> - uninitialized(integer) + uninitialized(int) ["b1"]=> NULL } diff --git a/Zend/tests/type_declarations/typed_properties_060.phpt b/Zend/tests/type_declarations/typed_properties_060.phpt index b1d16bd3c6be..03087a017d66 100644 --- a/Zend/tests/type_declarations/typed_properties_060.phpt +++ b/Zend/tests/type_declarations/typed_properties_060.phpt @@ -16,7 +16,7 @@ $o->a = "a"; --EXPECTF-- int(1) -Fatal error: Uncaught TypeError: Typed property A::$a must be integer, string used in %s:%d +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 index d3219d25b86e..2b9e8b38f42b 100644 --- a/Zend/tests/type_declarations/typed_properties_061.phpt +++ b/Zend/tests/type_declarations/typed_properties_061.phpt @@ -48,11 +48,11 @@ echo gettype($a->foo),"\n"; --EXPECT-- int(2) int(21) -Cannot assign string to reference of type integer +Cannot assign string to reference of type int int(21) int(20) int(19) -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer diff --git a/Zend/tests/type_declarations/typed_properties_062.phpt b/Zend/tests/type_declarations/typed_properties_062.phpt index 95d22f4ae7c0..2f36daba93e7 100644 --- a/Zend/tests/type_declarations/typed_properties_062.phpt +++ b/Zend/tests/type_declarations/typed_properties_062.phpt @@ -52,14 +52,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference of type integer +Cannot assign string to reference of type int int(21) int(20) int(19) -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer -Cannot assign array to reference of type integer +Cannot assign array to reference 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 index 10e926e78eaf..abfde99d5b33 100644 --- a/Zend/tests/type_declarations/typed_properties_063.phpt +++ b/Zend/tests/type_declarations/typed_properties_063.phpt @@ -51,14 +51,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference of type integer +Cannot assign string to reference of type int int(21) int(20) int(19) -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer -Cannot assign array to reference of type integer +Cannot assign array to reference 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 index 40df2e0392d2..08bc33a22feb 100644 --- a/Zend/tests/type_declarations/typed_properties_064.phpt +++ b/Zend/tests/type_declarations/typed_properties_064.phpt @@ -51,14 +51,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference of type integer +Cannot assign string to reference of type int int(21) int(20) int(19) -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer -Cannot assign array to reference of type integer +Cannot assign array to reference 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 index 4c0285ee8a36..0ca8fecba7c1 100644 --- a/Zend/tests/type_declarations/typed_properties_065.phpt +++ b/Zend/tests/type_declarations/typed_properties_065.phpt @@ -45,11 +45,11 @@ echo gettype($a->foo),"\n"; --EXPECT-- int(2) int(21) -Cannot assign string to reference of type integer +Cannot assign string to reference of type int int(21) int(20) int(19) -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 3ae0bc0aa502..439cc99cc4e9 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2708,8 +2708,7 @@ static zend_op *zend_compile_prop(znode *result, zend_ast *ast, uint32_t type, i { uint32_t offset = zend_delayed_compile_begin(); zend_op *opline = zend_delayed_compile_prop(result, ast, type); - if (by_ref) { - /* TODO(typed_props) extended_value is now used for the cache slot */ + if (by_ref && (type == BP_VAR_W || type == BP_VAR_FUNC_ARG)) { /* shared with cache_slot */ opline->extended_value |= ZEND_FETCH_REF; } return zend_delayed_compile_end(offset); diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index f2c6cd6f8f2c..610a76d17d9d 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -876,8 +876,7 @@ void zend_assert_valid_class_name(const zend_string *const_name); #define ZEND_FETCH_TYPE_MASK 0xe -/* TODO(typed_refs) Is this still free? */ -#define ZEND_FETCH_REF 0x00400000 +#define ZEND_FETCH_REF (1<<0) #define ZEND_ISEMPTY (1<<0) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index cae733058276..d5a378f61777 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2066,7 +2066,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); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 901009b7b37a..609da2eebb42 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4751,7 +4751,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); @@ -6835,7 +6835,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); @@ -9905,7 +9905,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); @@ -13561,7 +13561,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); @@ -15145,7 +15145,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); @@ -17007,7 +17007,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); @@ -32516,7 +32516,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); @@ -34731,7 +34731,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); @@ -37575,7 +37575,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); @@ -42676,7 +42676,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); @@ -46920,7 +46920,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); @@ -52976,7 +52976,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); From f55663f47d80510015c881a04a1df9792ad55af5 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 8 Jun 2018 10:11:09 +0200 Subject: [PATCH 229/369] Fix cache_slot of ASSIGN_OBJ_REF --- Zend/zend_compile.c | 3 +- Zend/zend_compile.h | 4 +- Zend/zend_vm_def.h | 6 +-- Zend/zend_vm_execute.h | 72 +++++++++++++++---------------- Zend/zend_vm_opcodes.c | 2 +- ext/opcache/Optimizer/zend_dump.c | 2 +- 6 files changed, 45 insertions(+), 44 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 439cc99cc4e9..64977a4e4b42 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3091,10 +3091,11 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ zend_make_var_result(result, opline); } else { opline = zend_emit_op(result, ZEND_ASSIGN_REF, &target_node, &source_node); + opline->extended_value = 0; } if (zend_is_call(source_ast)) { - opline->extended_value = ZEND_RETURNS_FUNCTION; + opline->extended_value |= ZEND_RETURNS_FUNCTION; } } /* }}} */ diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 610a76d17d9d..3ed021ed88f8 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -945,8 +945,8 @@ static zend_always_inline int zend_check_arg_send_type(const zend_function *zf, #define ZEND_RETURN_REF 1 -#define ZEND_RETURNS_FUNCTION 1<<0 -#define ZEND_RETURNS_VALUE 1<<1 +#define ZEND_RETURNS_FUNCTION (1<<0) +#define ZEND_RETURNS_VALUE (1<<1) #define ZEND_ARRAY_ELEMENT_REF (1<<0) #define ZEND_ARRAY_NOT_PACKED (1<<1) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d5a378f61777..655873f72463 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2646,7 +2646,7 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC) ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SRC, SPEC(OP_DATA=VAR|CV)) +ZEND_VM_HANDLER(199, 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; @@ -2660,7 +2660,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S SAVE_OPLINE(); if (OP_DATA_TYPE == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -2683,7 +2683,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S HANDLE_EXCEPTION(); } - cache_addr = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, OP1_TYPE, property, OP2_TYPE, cache_addr, BP_VAR_W, 0 OPLINE_CC); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 609da2eebb42..fd839ae3ab71 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -23887,7 +23887,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -23910,7 +23910,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ HANDLE_EXCEPTION(); } - cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -24013,7 +24013,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -24036,7 +24036,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ HANDLE_EXCEPTION(); } - cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -26627,7 +26627,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -26650,7 +26650,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR HANDLE_EXCEPTION(); } - cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -26753,7 +26753,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -26776,7 +26776,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR HANDLE_EXCEPTION(); } - cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -30981,7 +30981,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -31004,7 +31004,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ HANDLE_EXCEPTION(); } - cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -31107,7 +31107,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -31130,7 +31130,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ HANDLE_EXCEPTION(); } - cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -33328,7 +33328,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -33351,7 +33351,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON HANDLE_EXCEPTION(); } - cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -33453,7 +33453,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -33476,7 +33476,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON HANDLE_EXCEPTION(); } - cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -35545,7 +35545,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -35568,7 +35568,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP HANDLE_EXCEPTION(); } - cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -35670,7 +35670,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -35693,7 +35693,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP HANDLE_EXCEPTION(); } - cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -38387,7 +38387,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -38410,7 +38410,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ HANDLE_EXCEPTION(); } - cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -38512,7 +38512,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -38535,7 +38535,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ HANDLE_EXCEPTION(); } - cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -43917,7 +43917,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -43940,7 +43940,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O HANDLE_EXCEPTION(); } - cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -44042,7 +44042,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -44065,7 +44065,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O HANDLE_EXCEPTION(); } - cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -48108,7 +48108,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -48131,7 +48131,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ HANDLE_EXCEPTION(); } - cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -48233,7 +48233,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -48256,7 +48256,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ HANDLE_EXCEPTION(); } - cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -54265,7 +54265,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -54288,7 +54288,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D HANDLE_EXCEPTION(); } - cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -54390,7 +54390,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -54413,7 +54413,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D HANDLE_EXCEPTION(); } - cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 8d72fbb26eec..bb62e817e5f8 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -425,7 +425,7 @@ static uint32_t zend_vm_opcodes_flags[200] = { 0x00000101, 0x00020101, 0x00000701, - 0x0b000751, + 0x0b040751, }; ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode) { diff --git a/ext/opcache/Optimizer/zend_dump.c b/ext/opcache/Optimizer/zend_dump.c index a4c324c5b1f4..caf672e68627 100644 --- a/ext/opcache/Optimizer/zend_dump.c +++ b/ext/opcache/Optimizer/zend_dump.c @@ -554,7 +554,7 @@ static void zend_dump_op(const zend_op_array *op_array, const zend_basic_block * } else if (ZEND_VM_EXT_SRC == (flags & ZEND_VM_EXT_MASK)) { if (opline->extended_value == ZEND_RETURNS_VALUE) { fprintf(stderr, " (value)"); - } else if (opline->extended_value == ZEND_RETURNS_FUNCTION) { + } else if (opline->extended_value & ZEND_RETURNS_FUNCTION) { fprintf(stderr, " (function)"); } } else { From 6d0c4437ccb8aac4318e5403a73f160309800b43 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 8 Jun 2018 14:10:08 +0200 Subject: [PATCH 230/369] Opcache fixes --- ext/opcache/Optimizer/compact_literals.c | 7 +- ext/opcache/Optimizer/dce.c | 1 + ext/opcache/Optimizer/escape_analysis.c | 6 +- ext/opcache/Optimizer/sccp.c | 1 + ext/opcache/Optimizer/zend_dfg.c | 1 + ext/opcache/Optimizer/zend_inference.c | 101 ++++++++++++++++++----- ext/opcache/Optimizer/zend_ssa.c | 1 + 7 files changed, 93 insertions(+), 25 deletions(-) diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index e98a2e75c098..2dbbd230c2a4 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -507,6 +507,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx } break; case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: case ZEND_FETCH_OBJ_R: case ZEND_FETCH_OBJ_W: case ZEND_FETCH_OBJ_RW: @@ -522,12 +523,12 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx // op2 property if (opline->op1_type == IS_UNUSED && property_slot[opline->op2.constant] >= 0) { - opline->extended_value = property_slot[opline->op2.constant]; + opline->extended_value = property_slot[opline->op2.constant] | (opline->extended_value & ZEND_FETCH_REF); } else { - opline->extended_value = cache_size; + opline->extended_value = cache_size | (opline->extended_value & ZEND_FETCH_REF); cache_size += 3 * sizeof(void *); if (opline->op1_type == IS_UNUSED) { - property_slot[opline->op2.constant] = opline->extended_value; + property_slot[opline->op2.constant] = opline->extended_value & ~ZEND_FETCH_REF; } } } diff --git a/ext/opcache/Optimizer/dce.c b/ext/opcache/Optimizer/dce.c index 4a35c9e5d3ec..6133fd084bde 100644 --- a/ext/opcache/Optimizer/dce.c +++ b/ext/opcache/Optimizer/dce.c @@ -326,6 +326,7 @@ static zend_bool try_remove_var_def(context *ctx, int free_var, int use_chain, z switch (def_opline->opcode) { case ZEND_ASSIGN: case ZEND_ASSIGN_REF: + case ZEND_ASSIGN_OBJ_REF: case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: case ZEND_ASSIGN_ADD: diff --git a/ext/opcache/Optimizer/escape_analysis.c b/ext/opcache/Optimizer/escape_analysis.c index 66866e8b24b6..ebae51f7dbb1 100644 --- a/ext/opcache/Optimizer/escape_analysis.c +++ b/ext/opcache/Optimizer/escape_analysis.c @@ -217,6 +217,7 @@ static int is_allocation_def(zend_op_array *op_array, zend_ssa *ssa, int def, in break; case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: if (OP1_INFO() & (MAY_BE_UNDEF | MAY_BE_NULL | MAY_BE_FALSE)) { /* implicit object/array allocation */ return 1; @@ -259,6 +260,7 @@ static int is_local_def(zend_op_array *op_array, zend_ssa *ssa, int def, int var return 1; case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: return 1; case ZEND_ASSIGN_ADD: case ZEND_ASSIGN_SUB: @@ -328,6 +330,7 @@ static int is_escape_use(zend_op_array *op_array, zend_ssa *ssa, int use, int va /* break missing intentionally */ case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: break; case ZEND_PRE_INC_OBJ: case ZEND_PRE_DEC_OBJ: @@ -508,7 +511,8 @@ int zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array, if (opline->opcode == ZEND_OP_DATA && ((opline-1)->opcode == ZEND_ASSIGN_DIM || - (opline-1)->opcode == ZEND_ASSIGN_OBJ) && + (opline-1)->opcode == ZEND_ASSIGN_OBJ || + (opline-1)->opcode == ZEND_ASSIGN_OBJ_REF) && op->op1_use == i && (op-1)->op1_use >= 0) { enclosing_root = ees[(op-1)->op1_use]; diff --git a/ext/opcache/Optimizer/sccp.c b/ext/opcache/Optimizer/sccp.c index 5511313fae76..315b1338ec7d 100644 --- a/ext/opcache/Optimizer/sccp.c +++ b/ext/opcache/Optimizer/sccp.c @@ -203,6 +203,7 @@ static zend_bool can_replace_op1( case ZEND_ASSIGN_REF: case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: case ZEND_ASSIGN_ADD: case ZEND_ASSIGN_SUB: case ZEND_ASSIGN_MUL: diff --git a/ext/opcache/Optimizer/zend_dfg.c b/ext/opcache/Optimizer/zend_dfg.c index 224ea56167a1..aca528b40438 100644 --- a/ext/opcache/Optimizer/zend_dfg.c +++ b/ext/opcache/Optimizer/zend_dfg.c @@ -92,6 +92,7 @@ int zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, zend_dfg case ZEND_UNSET_CV: case ZEND_ASSIGN: case ZEND_ASSIGN_REF: + case ZEND_ASSIGN_OBJ_REF: case ZEND_BIND_GLOBAL: case ZEND_BIND_STATIC: case ZEND_SEND_VAR_EX: diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 20ce0710593a..6e5af2f5d178 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -2231,6 +2231,24 @@ static inline zend_class_entry *get_class_entry(const zend_script *script, zend_ return NULL; } +static uint32_t zend_convert_type_code_to_may_be(zend_uchar type_code) { + if (type_code == IS_VOID) { + return MAY_BE_NULL; + } else if (type_code == IS_CALLABLE) { + return MAY_BE_STRING|MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; + } else if (type_code == IS_ITERABLE) { + return MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; + } else if (type_code == IS_ARRAY) { + return MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; + } else if (type_code == _IS_BOOL) { + return MAY_BE_TRUE|MAY_BE_FALSE; + } + + ZEND_ASSERT(type_code < IS_REFERENCE); + return 1 << type_code; + +} + static uint32_t zend_fetch_arg_info(const zend_script *script, zend_arg_info *arg_info, zend_class_entry **pce) { uint32_t tmp = 0; @@ -2243,22 +2261,7 @@ static uint32_t zend_fetch_arg_info(const zend_script *script, zend_arg_info *ar *pce = get_class_entry(script, lcname); zend_string_release_ex(lcname, 0); } else if (ZEND_TYPE_IS_CODE(arg_info->type)) { - zend_uchar type_hint = ZEND_TYPE_CODE(arg_info->type); - - if (type_hint == IS_VOID) { - tmp |= MAY_BE_NULL; - } else if (type_hint == IS_CALLABLE) { - tmp |= MAY_BE_STRING|MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; - } else if (type_hint == IS_ITERABLE) { - tmp |= MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; - } else if (type_hint == IS_ARRAY) { - tmp |= MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; - } else if (type_hint == _IS_BOOL) { - tmp |= MAY_BE_TRUE|MAY_BE_FALSE; - } else { - ZEND_ASSERT(type_hint < IS_REFERENCE); - tmp |= 1 << type_hint; - } + tmp |= zend_convert_type_code_to_may_be(ZEND_TYPE_CODE(arg_info->type)); } else { tmp |= MAY_BE_ANY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; } @@ -2286,7 +2289,7 @@ static uint32_t zend_fetch_prop_info(const zend_op_array *op_array, zend_ssa *ss } if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { - uint32_t type = MAY_BE_UNDEF | MAY_BE_REF | (1 << (ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type))); + uint32_t type = MAY_BE_UNDEF | MAY_BE_REF | (ZEND_TYPE_IS_CLASS(prop_info->type) ? MAY_BE_OBJECT : zend_convert_type_code_to_may_be(ZEND_TYPE_CODE(prop_info->type))); if (ZEND_TYPE_ALLOW_NULL(prop_info->type)) { type |= MAY_BE_NULL; @@ -2868,6 +2871,58 @@ static int zend_update_type_info(const zend_op_array *op_array, UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); } break; + case ZEND_ASSIGN_OBJ_REF: + if (opline->op1_type == IS_CV) { + tmp = t1; + if (t1 & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE)) { + tmp &= ~(MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE); + tmp |= MAY_BE_OBJECT | MAY_BE_RC1 | MAY_BE_RCN; + } + if (tmp & MAY_BE_OBJECT) { + tmp |= MAY_BE_RC1 | MAY_BE_RCN; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); + COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); + } + t2 = OP1_DATA_INFO(); + if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION)) { + tmp = (MAY_BE_REF | MAY_BE_RCN | MAY_BE_RC1 | t2) & ~MAY_BE_UNDEF; + } else { + tmp = (MAY_BE_REF | t2) & ~(MAY_BE_UNDEF|MAY_BE_ERROR|MAY_BE_RC1|MAY_BE_RCN); + } + if (t2 & MAY_BE_UNDEF) { + tmp |= MAY_BE_NULL; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); + if (ssa_ops[i].result_def >= 0) { + // TODO: ??? + t1 = zend_fetch_prop_info(op_array, ssa, opline, i, &ce); + if (t1) { + tmp &= t1; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); + if (ce) { + UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); + } + } + if ((opline+1)->op1_type == IS_CV) { + opline++; + i++; + tmp = (MAY_BE_REF | t2) & ~(MAY_BE_UNDEF|MAY_BE_RC1|MAY_BE_RCN); + if (t2 & MAY_BE_UNDEF) { + tmp |= MAY_BE_NULL; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); + + tmp = OP1_INFO(); + if (tmp & (MAY_BE_ANY | MAY_BE_REF)) { + if (tmp & MAY_BE_RC1) { + tmp |= MAY_BE_RCN; + } + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); + } + break; case ZEND_BIND_GLOBAL: tmp = MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; @@ -3300,6 +3355,7 @@ static int zend_update_type_info(const zend_op_array *op_array, case ZEND_SEND_VAR_NO_REF_EX: case ZEND_SEND_REF: case ZEND_ASSIGN_REF: + case ZEND_ASSIGN_OBJ_REF: case ZEND_YIELD: case ZEND_INIT_ARRAY: case ZEND_ADD_ARRAY_ELEMENT: @@ -4234,7 +4290,7 @@ int zend_may_throw(const zend_op *opline, zend_op_array *op_array, zend_ssa *ssa return 1; } } - } else if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) { + } else if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) { if (t1 & (MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_ARRAY)) { switch (opline->opcode) { case ZEND_CASE: @@ -4258,9 +4314,9 @@ int zend_may_throw(const zend_op *opline, zend_op_array *op_array, zend_ssa *ssa return 1; } } - } + } - if (opline->op2_type == IS_CV) { + if (opline->op2_type == IS_CV) { if (t2 & MAY_BE_UNDEF) { switch (opline->opcode) { case ZEND_ASSIGN_REF: @@ -4280,7 +4336,7 @@ int zend_may_throw(const zend_op *opline, zend_op_array *op_array, zend_ssa *ssa return 1; } } - } + } switch (opline->opcode) { case ZEND_NOP: @@ -4442,6 +4498,9 @@ int zend_may_throw(const zend_op *opline, zend_op_array *op_array, zend_ssa *ssa return (t1 & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT)) || (t2 & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT)); case ZEND_ASSIGN: + if (t1 & MAY_BE_REF) { + return 1; + } case ZEND_UNSET_VAR: return (t1 & (MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_ARRAY)); case ZEND_ASSIGN_DIM: diff --git a/ext/opcache/Optimizer/zend_ssa.c b/ext/opcache/Optimizer/zend_ssa.c index a18f4a875c09..04e398fb75d0 100644 --- a/ext/opcache/Optimizer/zend_ssa.c +++ b/ext/opcache/Optimizer/zend_ssa.c @@ -629,6 +629,7 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags, break; case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: if (opline->op1_type == IS_CV) { ssa_ops[k].op1_def = ssa_vars_count; var[EX_VAR_TO_NUM(opline->op1.var)] = ssa_vars_count; From c453c98f6bbd3998be16b0895102735bc12df12a Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 8 Jun 2018 14:31:43 +0200 Subject: [PATCH 231/369] Fix build failure in exif --- ext/exif/exif.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/exif/exif.c b/ext/exif/exif.c index c57902bcecb6..500609530016 100644 --- a/ext/exif/exif.c +++ b/ext/exif/exif.c @@ -4650,11 +4650,11 @@ PHP_FUNCTION(exif_thumbnail) if (!ImageInfo.Thumbnail.width || !ImageInfo.Thumbnail.height) { exif_scan_thumbnail(&ImageInfo); } - ZEND_TRY_ASSIGN_LONG(p_width, ImageInfo.Thumbnail.width); - ZEND_TRY_ASSIGN_LONG(p_height, ImageInfo.Thumbnail.height); + ZEND_TRY_ASSIGN_LONG(z_width, ImageInfo.Thumbnail.width); + ZEND_TRY_ASSIGN_LONG(z_height, ImageInfo.Thumbnail.height); } if (arg_c >= 4) { - ZEND_TRY_ASSIGN_LONG(p_imagetype, ImageInfo.Thumbnail.filetype); + ZEND_TRY_ASSIGN_LONG(z_imagetype, ImageInfo.Thumbnail.filetype); } #ifdef EXIF_DEBUG From 64a309f8878014dfe43d07edff6ecad643a5e561 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 8 Jun 2018 14:39:32 +0200 Subject: [PATCH 232/369] Add one more test for iterables by ref --- .../typed_properties_067.phpt | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_067.phpt 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 000000000000..546ea9167af4 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_067.phpt @@ -0,0 +1,37 @@ +--TEST-- +Iterable typed properties must be accepted to by-ref array arguments +--FILE-- +it); +var_dump($obj->it); +array_shift($obj->it); +var_dump($obj->it); +parse_str("foo=bar", $obj->it); +var_dump($obj->it); +$obj->it = []; +var_dump($obj->it); + +?> +--EXPECT-- +array(1) { + [0]=> + int(1) +} +array(0) { +} +array(1) { + ["foo"]=> + string(3) "bar" +} +array(0) { +} + From 98019a9c7d4469621d26d9c5ed49bf46bac53282 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 8 Jun 2018 14:54:22 +0200 Subject: [PATCH 233/369] Fix foreach object iteration with holes --- Zend/zend_vm_def.h | 3 ++- Zend/zend_vm_execute.h | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 655873f72463..c1f33438efc6 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -6426,7 +6426,8 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR) break; } } - break; + pos++; + p++; } if ((value_type & Z_TYPE_MASK) != IS_REFERENCE) { zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(array), p->key, NULL); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index fd839ae3ab71..6bbef8adb7f1 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -21511,7 +21511,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z break; } } - break; + pos++; + p++; } if ((value_type & Z_TYPE_MASK) != IS_REFERENCE) { zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(array), p->key, NULL); From 83ec0dfc74d26386de0b79ef7150d1bb114ccebd Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 9 Jun 2018 10:39:15 +0200 Subject: [PATCH 234/369] Restore old code for post_incdec as well --- Zend/zend_execute.c | 49 +++++++++++---------------------------------- 1 file changed, 12 insertions(+), 37 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index cc187e9a7683..465f69cc0e33 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1611,7 +1611,7 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, { if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) { zval rv, obj; - zval *z, *tmp; + zval *z; zval z_copy; ZVAL_OBJ(&obj, Z_OBJ_P(object)); @@ -1632,46 +1632,21 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, ZVAL_COPY_VALUE(z, value); } - /* TODO(typed_refs) Is this even necessary? The increment here is (was) performed on - * a dereferenced value and then written back. The type check in write_property should - * thus be sufficient. */ - if (UNEXPECTED(Z_ISREF_P(z))) { - zend_property_info *prop_info; - zend_type ref_type = Z_REFTYPE_P(z); - tmp = Z_REFVAL_P(z); - ZVAL_COPY(EX_VAR(opline->result.var), tmp); - - if (inc) { - increment_function(tmp); - } else { - decrement_function(tmp); - } - - if (UNEXPECTED(ref_type || (prop_info = zend_object_fetch_property_type_info(Z_OBJCE(obj), Z_STR_P(property), NULL)))) { - /* ref types are always stricter than prop types */ - if (UNEXPECTED(ref_type ? !zend_verify_ref_type_assignable_zval(ref_type, tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))) : !zend_verify_property_type(prop_info, &z_copy, &z_copy, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { - if (ref_type) { - zend_throw_ref_type_error(ref_type, tmp); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), tmp); - } - zval_ptr_dtor(tmp); - ZVAL_COPY_VALUE(tmp, EX_VAR(opline->result.var)); - } - } + if (UNEXPECTED(Z_TYPE_P(z) == IS_REFERENCE)) { + ZVAL_COPY(EX_VAR(opline->result.var), Z_REFVAL_P(z)); } else { ZVAL_COPY(EX_VAR(opline->result.var), z); - ZVAL_COPY(&z_copy, EX_VAR(opline->result.var)); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot); - zval_ptr_dtor(&z_copy); } - zval_ptr_dtor(z); + ZVAL_COPY(&z_copy, EX_VAR(opline->result.var)); + 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); } else { zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); From 7f596811380398f4c83ab2524f5afc216f091236 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 9 Jun 2018 10:42:55 +0200 Subject: [PATCH 235/369] Adjust test with new behavior The reference is no longer modified, so no problems. Any necessary type check would occur in the write_property part. --- .../typed_properties_061.phpt | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_061.phpt b/Zend/tests/type_declarations/typed_properties_061.phpt index 2b9e8b38f42b..a12d2c76eaa7 100644 --- a/Zend/tests/type_declarations/typed_properties_061.phpt +++ b/Zend/tests/type_declarations/typed_properties_061.phpt @@ -11,7 +11,7 @@ $a = new class { } function __set($x, $y) { - print "ERROR: __set() called on by-ref __get()"; + echo "set($y)\n"; } }; @@ -21,9 +21,7 @@ var_dump($a->foo); $a->_ .= "1"; var_dump($a->foo); -try { - $a->_ .= "e50"; -} catch (Error $e) { echo $e->getMessage(), "\n"; } +$a->_ .= "e50"; var_dump($a->foo); $a->_--; @@ -34,25 +32,25 @@ var_dump($a->foo); $a->foo = PHP_INT_MAX; -try { - $a->_++; -} catch (Error $e) { echo $e->getMessage(), "\n"; } -echo gettype($a->foo),"\n"; +$a->_++; +var_dump($a->foo); -try { - ++$a->_; -} catch (Error $e) { echo $e->getMessage(), "\n"; } -echo gettype($a->foo),"\n"; +++$a->_; +var_dump($a->foo); ?> --EXPECT-- -int(2) -int(21) -Cannot assign string to reference of type int -int(21) -int(20) -int(19) -Cannot assign float to reference of type int -integer -Cannot assign float to reference of type int -integer +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) From 1b0bc3374c62adc1f01a8c3cc6e6050265c10a56 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 9 Jun 2018 10:50:00 +0200 Subject: [PATCH 236/369] Fix compiler warning --- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d03d6936d197..462605240c5d 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1526,7 +1526,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) { USE_OPLINE zend_free_op free_op1; - zval *var_ptr, *val; + zval *var_ptr; zend_type ref_type = 0; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index e2b703065ca6..40e8de7a7b27 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -20443,7 +20443,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND { USE_OPLINE zend_free_op free_op1; - zval *var_ptr, *val; + zval *var_ptr; zend_type ref_type = 0; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -39451,7 +39451,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ { USE_OPLINE - zval *var_ptr, *val; + zval *var_ptr; zend_type ref_type = 0; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); From 2e28eb6203c2b66187af4d40dd92425bae81a061 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 9 Jun 2018 12:00:19 +0200 Subject: [PATCH 237/369] Improve default value handling * Don't allow null for callable, consistent with everything else. Previously null was allowed as default value, but not at runtime... * Allow arrays as default for iterable. * Print friendlier error message when using null default value, suggesting to use ?Type. --- .../typed_properties_013.phpt | 6 +-- .../typed_properties_014.phpt | 7 +-- .../typed_properties_015.phpt | 6 +-- .../typed_properties_016.phpt | 1 + .../typed_properties_049.phpt | 44 +------------------ .../typed_properties_053.phpt | 2 +- .../typed_properties_054.phpt | 2 +- Zend/zend_compile.c | 39 +++++++++------- 8 files changed, 31 insertions(+), 76 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_013.phpt b/Zend/tests/type_declarations/typed_properties_013.phpt index e6b4751f3a46..01c2f4b6a0d8 100644 --- a/Zend/tests/type_declarations/typed_properties_013.phpt +++ b/Zend/tests/type_declarations/typed_properties_013.phpt @@ -7,8 +7,4 @@ class Foo { } ?> --EXPECTF-- -Fatal error: Default value for properties with int type can only be int in %s on line 3 - - - - +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 index 48486078afb6..2a02f0381ed2 100644 --- a/Zend/tests/type_declarations/typed_properties_014.phpt +++ b/Zend/tests/type_declarations/typed_properties_014.phpt @@ -3,11 +3,8 @@ Test typed properties disallow incorrect type initial value (array) --FILE-- --EXPECTF-- -Fatal error: Default value for properties with array type can only be an array in %s on line 3 - - - +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 index db880ceed0c7..ac11c0fe3efa 100644 --- a/Zend/tests/type_declarations/typed_properties_015.phpt +++ b/Zend/tests/type_declarations/typed_properties_015.phpt @@ -7,8 +7,4 @@ class Foo { } ?> --EXPECTF-- -Fatal error: Default value for properties with class type are disallowed in %s on line 3 - - - - +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 index 28cd239d0434..6468478930dd 100644 --- a/Zend/tests/type_declarations/typed_properties_016.phpt +++ b/Zend/tests/type_declarations/typed_properties_016.phpt @@ -7,6 +7,7 @@ class Foo { public float $flt = 2.2; public array $arr = []; public bool $bool = false; + public iterable $iter = []; } echo "ok\n"; ?> diff --git a/Zend/tests/type_declarations/typed_properties_049.phpt b/Zend/tests/type_declarations/typed_properties_049.phpt index 70483f131633..e76159054802 100644 --- a/Zend/tests/type_declarations/typed_properties_049.phpt +++ b/Zend/tests/type_declarations/typed_properties_049.phpt @@ -5,48 +5,6 @@ Nullable typed property class Foo { public int $foo = null; } -$x = new Foo(); -var_dump($x); -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - $x->foo = 5; -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - $x->foo = null; -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - unset($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - $x->foo = "ops"; -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} ?> --EXPECTF-- -Fatal error: Default value for properties with int type can only be int in %styped_properties_049.php on line 3 +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_053.phpt b/Zend/tests/type_declarations/typed_properties_053.phpt index 45255ef9e962..86b5bfb01398 100644 --- a/Zend/tests/type_declarations/typed_properties_053.phpt +++ b/Zend/tests/type_declarations/typed_properties_053.phpt @@ -4,7 +4,7 @@ Default values of callable properties --EXPECTF-- -Fatal error: Default value for properties with callable type can only be null in %styped_properties_054.php on line 3 +Fatal error: Property of type callable may not have default value in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 64977a4e4b42..d301c1113d47 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6059,16 +6059,17 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ ZSTR_VAL(name)); } + if (type_ast->attr & ZEND_TYPE_NULLABLE) { + allow_null = 1; + type_ast->attr &= ~ZEND_TYPE_NULLABLE; + } + if (type_ast->kind == ZEND_AST_TYPE) { optional_type = type_ast->attr; } else { zend_string *class_name = zend_ast_get_str(type_ast); zend_uchar type = zend_lookup_builtin_type_by_name(class_name); - if (type_ast->attr & ZEND_TYPE_NULLABLE) { - allow_null = 1; - type_ast->attr &= ~ZEND_TYPE_NULLABLE; - } if (type != 0) { if (type_ast->attr != ZEND_NAME_NOT_FQ) { zend_error_noreturn(E_COMPILE_ERROR, @@ -6121,24 +6122,30 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ zend_const_expr_to_zval(&value_zv, value_ast); if (optional_type && !Z_CONSTANT(value_zv)) { - if (allow_null && Z_TYPE(value_zv) == IS_NULL) { - /* pass */ - } else if (optional_type == IS_ARRAY) { - if (Z_TYPE(value_zv) != IS_ARRAY) { + if (Z_TYPE(value_zv) == IS_NULL) { + if (!allow_null) { + const char *name = optional_type_name + ? ZSTR_VAL(optional_type_name) : zend_get_type_by_const(optional_type); zend_error_noreturn(E_COMPILE_ERROR, - "Default value for properties with array type can only be an array"); + "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 (optional_type == IS_CALLABLE) { - if (Z_TYPE(value_zv) != IS_NULL) { + } else if (optional_type_name || + optional_type == IS_CALLABLE || optional_type == IS_OBJECT) { + const char *name = optional_type_name + ? ZSTR_VAL(optional_type_name) : zend_get_type_by_const(optional_type); + zend_error_noreturn(E_COMPILE_ERROR, + "Property of type %s may not have default value", name); + } else if (optional_type == IS_ARRAY || optional_type == IS_ITERABLE) { + if (Z_TYPE(value_zv) != IS_ARRAY) { zend_error_noreturn(E_COMPILE_ERROR, - "Default value for properties with callable type can only be null"); + "Default value for property of type %s can only be an array", + zend_get_type_by_const(optional_type)); } - } else if (optional_type == IS_OBJECT) { - zend_error_noreturn(E_COMPILE_ERROR, - "Default value for properties with class type are disallowed"); } else if (!ZEND_SAME_FAKE_TYPE(optional_type, Z_TYPE(value_zv))) { zend_error_noreturn(E_COMPILE_ERROR, - "Default value for properties with %s type can only be %s", + "Default value for property of type %s can only be %s", zend_get_type_by_const(optional_type), zend_get_type_by_const(optional_type)); } From 44735544871cb0b31b29dbcdd5f23c8bab981258 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 9 Jun 2018 15:50:19 +0200 Subject: [PATCH 238/369] Allow int default value for float properties --- Zend/tests/type_declarations/typed_properties_016.phpt | 1 + Zend/zend_compile.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/Zend/tests/type_declarations/typed_properties_016.phpt b/Zend/tests/type_declarations/typed_properties_016.phpt index 6468478930dd..e7f81c2731c7 100644 --- a/Zend/tests/type_declarations/typed_properties_016.phpt +++ b/Zend/tests/type_declarations/typed_properties_016.phpt @@ -5,6 +5,7 @@ Test typed properties initial values 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 = []; diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index d301c1113d47..616a3a21fe41 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6143,6 +6143,11 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ "Default value for property of type %s can only be an array", zend_get_type_by_const(optional_type)); } + } else if (optional_type == IS_DOUBLE) { + if (Z_TYPE(value_zv) != IS_DOUBLE && Z_TYPE(value_zv) != IS_LONG) { + zend_error_noreturn(E_COMPILE_ERROR, + "Default value for property of type float can only be float or int"); + } } else if (!ZEND_SAME_FAKE_TYPE(optional_type, Z_TYPE(value_zv))) { zend_error_noreturn(E_COMPILE_ERROR, "Default value for property of type %s can only be %s", From 4ef062689336a805b4de9ef95b15db207f6643c0 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 9 Jun 2018 17:43:12 +0200 Subject: [PATCH 239/369] Use not_in_object_context helper --- Zend/zend_vm_def.h | 10 +-- Zend/zend_vm_execute.h | 180 +++++++++++++++++------------------------ 2 files changed, 76 insertions(+), 114 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 462605240c5d..b2293572d93c 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2673,16 +2673,14 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ASSIGN_OBJ); } - property = GET_OP2_ZVAL_PTR(BP_VAR_R); - container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - FREE_OP2(); - FREE_UNFETCHED_OP_DATA(); - HANDLE_EXCEPTION(); + ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper); } + property = GET_OP2_ZVAL_PTR(BP_VAR_R); + cache_addr = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, OP1_TYPE, property, OP2_TYPE, cache_addr, BP_VAR_W, 0 OPLINE_CC); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 40e8de7a7b27..d74c8d47f4cc 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -23861,16 +23861,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = RT_CONSTANT(opline, opline->op2); - 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_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = RT_CONSTANT(opline, opline->op2); + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -23987,16 +23985,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = RT_CONSTANT(opline, opline->op2); - 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_throw_error(NULL, "Using $this when not in object context"); - - HANDLE_EXCEPTION(); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = RT_CONSTANT(opline, opline->op2); + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -26601,16 +26597,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); - 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_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(free_op2); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -26727,16 +26721,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); - 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_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -30955,16 +30947,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - 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_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -31081,16 +31071,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - 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_throw_error(NULL, "Using $this when not in object context"); - - HANDLE_EXCEPTION(); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -33302,16 +33290,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = RT_CONSTANT(opline, opline->op2); - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); - if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = RT_CONSTANT(opline, opline->op2); + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -33427,16 +33413,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = RT_CONSTANT(opline, opline->op2); - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); - if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - - HANDLE_EXCEPTION(); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = RT_CONSTANT(opline, opline->op2); + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -35519,16 +35503,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(free_op2); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -35644,16 +35626,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); - if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -38361,16 +38341,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); - if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -38486,16 +38464,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); - if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - - HANDLE_EXCEPTION(); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -43891,16 +43867,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = RT_CONSTANT(opline, opline->op2); - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); - if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = RT_CONSTANT(opline, opline->op2); + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -44016,16 +43990,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = RT_CONSTANT(opline, opline->op2); - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); - if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - - HANDLE_EXCEPTION(); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = RT_CONSTANT(opline, opline->op2); + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -48082,16 +48054,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(free_op2); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -48207,16 +48177,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); - if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -54239,16 +54207,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); - if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -54364,16 +54330,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); - if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - - HANDLE_EXCEPTION(); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); From cb75a2554086f02b60e29cb1e05e8c2ca6a931fb Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 10 Jun 2018 00:23:43 +0200 Subject: [PATCH 240/369] Fix ASSIGN_OBJ_REF implementation Line up logic with ASSIGN_REF, fixing various discrepancies. --- Zend/tests/bug69732.phpt | 21 +- Zend/zend_vm_def.h | 52 ++- Zend/zend_vm_execute.h | 928 +++++++++++++++++++++------------------ 3 files changed, 539 insertions(+), 462 deletions(-) diff --git a/Zend/tests/bug69732.phpt b/Zend/tests/bug69732.phpt index 4503235f53d3..8d5fccd71211 100644 --- a/Zend/tests/bug69732.phpt +++ b/Zend/tests/bug69732.phpt @@ -17,14 +17,15 @@ function ret_assoc() { $wpq = new wpq; $wpq->interesting =& ret_assoc(); -$x = &$wpq->interesting; -var_dump($x); -?> +$x = $wpq->interesting; +printf("%s\n", $x); --EXPECTF-- -Notice: Only variables should be assigned by reference in %s on line %d -array(2) { - ["foo"]=> - string(3) "bar" - [0]=> - string(3) "XXX" -} +Notice: Undefined property: wpq::$interesting in %sbug69732.php on line 6 + +Notice: Indirect modification of overloaded property wpq::$interesting has no effect in %sbug69732.php on line 16 + +Fatal error: Uncaught Error: Cannot assign by reference to overloaded object in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d + diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 308da145965c..d7b7a1fd5a54 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2658,20 +2658,6 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C SAVE_OPLINE(); - if (OP_DATA_TYPE == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - FREE_UNFETCHED_OP1(); - FREE_UNFETCHED_OP2(); - FREE_UNFETCHED_OP_DATA(); - HANDLE_EXCEPTION(); - } - - ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ASSIGN_OBJ); - } - container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -2683,24 +2669,42 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C cache_addr = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, OP1_TYPE, property, OP2_TYPE, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = GET_OP_DATA_ZVAL_PTR_PTR(BP_VAR_W); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); FREE_OP1_VAR_PTR(); FREE_OP2(); - FREE_UNFETCHED_OP_DATA(); + FREE_OP_DATA_VAR_PTR(); + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (OP_DATA_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (OP_DATA_TYPE == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = GET_OP_DATA_ZVAL_PTR_PTR(BP_VAR_W); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC))) { + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_OP_DATA_VAR_PTR(); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } - if ((OP_DATA_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); + /* op_data freed by assign_to_variable */ + FREE_OP1_VAR_PTR(); + FREE_OP2(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - variable_ptr = Z_INDIRECT(variable); - if ((OP2_TYPE == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index bb9e79baa493..6e3815a3f603 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -23847,20 +23847,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ SAVE_OPLINE(); - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - 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)) { @@ -23872,24 +23858,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -23971,20 +23975,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - 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)) { @@ -23996,24 +23986,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -26583,20 +26591,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR SAVE_OPLINE(); - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - 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)) { @@ -26608,24 +26602,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - variable_ptr = Z_INDIRECT(variable); - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -26707,20 +26719,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - 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)) { @@ -26732,24 +26730,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -30931,20 +30947,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ SAVE_OPLINE(); - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - 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)) { @@ -30956,24 +30958,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -31055,20 +31075,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - 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)) { @@ -31080,24 +31086,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -33274,20 +33298,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON SAVE_OPLINE(); - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -33299,24 +33309,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -33397,20 +33425,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -33422,24 +33436,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -35487,20 +35519,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP SAVE_OPLINE(); - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -35512,24 +35530,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); zval_ptr_dtor_nogc(free_op2); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -35610,20 +35646,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -35635,24 +35657,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -38318,26 +38358,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ zend_free_op free_op_data; zval *property; zval *container; - zval variable, *variable_ptr = &variable; - zval *value_ptr; - void **cache_addr; - zend_type ref_type = 0; - - SAVE_OPLINE(); - - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + zend_type ref_type = 0; - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } + SAVE_OPLINE(); container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); @@ -38350,24 +38376,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -38448,20 +38492,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -38473,24 +38503,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -43851,20 +43899,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O SAVE_OPLINE(); - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -43876,24 +43910,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -43974,20 +44026,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -43999,24 +44037,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -48038,20 +48094,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ SAVE_OPLINE(); - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -48063,24 +48105,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); zval_ptr_dtor_nogc(free_op2); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -48161,20 +48221,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -48186,24 +48232,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -54191,20 +54255,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D SAVE_OPLINE(); - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -54216,24 +54266,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -54314,20 +54382,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -54339,24 +54393,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; From 3021bbcb62b0e71f051cb72e4e249071c387bf73 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 11 Jun 2018 22:27:28 +0200 Subject: [PATCH 241/369] Don't automatically initialize nullable prop to null Handle them consistently with other types and initialize to "uninitialized", unless a default value is explicitly given. --- Zend/tests/type_declarations/typed_properties_047.phpt | 2 +- Zend/tests/type_declarations/typed_properties_052.phpt | 8 ++++---- Zend/tests/type_declarations/typed_properties_059.phpt | 6 +++--- Zend/zend_compile.c | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_047.phpt b/Zend/tests/type_declarations/typed_properties_047.phpt index 58fde94d3658..9267f53047ae 100644 --- a/Zend/tests/type_declarations/typed_properties_047.phpt +++ b/Zend/tests/type_declarations/typed_properties_047.phpt @@ -3,7 +3,7 @@ Nullable typed property --FILE-- --EXPECT-- -object(A)#1 (3) { +object(A)#1 (0) { ["a1"]=> uninitialized(A) ["b1"]=> @@ -26,9 +26,9 @@ object(A)#1 (3) { ["c1"]=> uninitialized(Foo\C) ["a2"]=> - NULL + uninitialized(?A) ["b2"]=> - NULL + uninitialized(?B) ["c2"]=> - NULL + uninitialized(?Foo\C) } diff --git a/Zend/tests/type_declarations/typed_properties_059.phpt b/Zend/tests/type_declarations/typed_properties_059.phpt index f54b3df278e1..caee8501f72b 100644 --- a/Zend/tests/type_declarations/typed_properties_059.phpt +++ b/Zend/tests/type_declarations/typed_properties_059.phpt @@ -17,13 +17,13 @@ $x = new A; var_dump($x); ?> --EXPECT-- -object(A)#1 (2) { +object(A)#1 (0) { ["a2"]=> uninitialized(int) ["b2"]=> - NULL + uninitialized(?int) ["a1"]=> uninitialized(int) ["b1"]=> - NULL + uninitialized(?int) } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 616a3a21fe41..ce8194cda315 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6155,7 +6155,7 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ zend_get_type_by_const(optional_type)); } } - } else if (!optional_type || allow_null) { + } else if (!optional_type) { ZVAL_NULL(&value_zv); } else { ZVAL_UNDEF(&value_zv); From 230142e1fe69195685b0c3e26c593ba15df0ebd1 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 12 Jun 2018 20:57:55 +0200 Subject: [PATCH 242/369] Forbid callable type hint in typed properties --- .../typed_properties_017.phpt | 6 +----- .../typed_properties_053.phpt | 14 ++++---------- .../typed_properties_054.phpt | 6 +++--- Zend/zend_compile.c | 18 +++++++++--------- 4 files changed, 17 insertions(+), 27 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_017.phpt b/Zend/tests/type_declarations/typed_properties_017.phpt index 23ddb4adf571..16de52ea12e8 100644 --- a/Zend/tests/type_declarations/typed_properties_017.phpt +++ b/Zend/tests/type_declarations/typed_properties_017.phpt @@ -9,8 +9,4 @@ class Foo { $foo = new Foo(); ?> --EXPECTF-- -Fatal error: Typed property Foo::$int must not be void in %s on line 3 - - - - +Fatal error: Typed property Foo::$int cannot have type void in %s on line 3 diff --git a/Zend/tests/type_declarations/typed_properties_053.phpt b/Zend/tests/type_declarations/typed_properties_053.phpt index 86b5bfb01398..e9635cd448e6 100644 --- a/Zend/tests/type_declarations/typed_properties_053.phpt +++ b/Zend/tests/type_declarations/typed_properties_053.phpt @@ -1,18 +1,12 @@ --TEST-- -Default values of callable properties +Typed properties disallow callable --FILE-- ---EXPECT-- -object(A)#1 (1) { - ["a1"]=> - uninitialized(callable) - ["a2"]=> - NULL -} +--EXPECTF-- +Fatal error: Typed 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 index 51ce8dfb3b58..ffdde768de17 100644 --- a/Zend/tests/type_declarations/typed_properties_054.phpt +++ b/Zend/tests/type_declarations/typed_properties_054.phpt @@ -1,12 +1,12 @@ --TEST-- -Default values of callable properties +Typed properties disallow callable (nullable variant) --FILE-- --EXPECTF-- -Fatal error: Property of type callable may not have default value in %s on line %d +Fatal error: Typed property A::$a cannot have type callable in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index ce8194cda315..48a6440f1109 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6077,13 +6077,6 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ ZSTR_VAL(zend_string_tolower(class_name))); } - if (type == IS_VOID) { - zend_error_noreturn(E_COMPILE_ERROR, - "Typed property %s::$%s must not be void", - ZSTR_VAL(ce->name), - ZSTR_VAL(name)); - } - optional_type = type; } else { uint32_t fetch_type = zend_get_class_fetch_type_ast(type_ast); @@ -6100,6 +6093,14 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ optional_type_name = class_name; } } + + if (optional_type == IS_VOID || optional_type == IS_CALLABLE) { + zend_error_noreturn(E_COMPILE_ERROR, + "Typed property %s::$%s cannot have type %s", + ZSTR_VAL(ce->name), + ZSTR_VAL(name), + zend_get_type_by_const(optional_type)); + } } /* Doc comment has been appended as last element in ZEND_AST_PROP_ELEM ast */ @@ -6131,8 +6132,7 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ "Use the nullable type ?%s to allow null default value", name, name); } - } else if (optional_type_name || - optional_type == IS_CALLABLE || optional_type == IS_OBJECT) { + } else if (optional_type_name || optional_type == IS_OBJECT) { const char *name = optional_type_name ? ZSTR_VAL(optional_type_name) : zend_get_type_by_const(optional_type); zend_error_noreturn(E_COMPILE_ERROR, From 759d0786c4cc114db4c95a3dde778f0a5505a221 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 14 Jun 2018 16:30:28 +0200 Subject: [PATCH 243/369] Add support for typed static properties (no opcache yet) --- .../typed_properties_023.phpt | 46 +- .../typed_properties_068.phpt | 102 + .../typed_properties_069.phpt | 28 + .../typed_properties_070.phpt | 50 + Zend/zend_API.c | 16 +- Zend/zend_compile.c | 27 +- Zend/zend_execute.c | 72 +- Zend/zend_object_handlers.c | 14 +- Zend/zend_object_handlers.h | 2 +- Zend/zend_vm_def.h | 175 +- Zend/zend_vm_execute.h | 3760 ++++++++++++++--- Zend/zend_vm_handlers.h | 1004 ++--- Zend/zend_vm_opcodes.c | 10 +- Zend/zend_vm_opcodes.h | 3 +- ext/reflection/php_reflection.c | 16 +- 15 files changed, 4051 insertions(+), 1274 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_068.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_069.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_070.phpt diff --git a/Zend/tests/type_declarations/typed_properties_023.phpt b/Zend/tests/type_declarations/typed_properties_023.phpt index ce6aa53c1387..e6ab663b2b36 100644 --- a/Zend/tests/type_declarations/typed_properties_023.phpt +++ b/Zend/tests/type_declarations/typed_properties_023.phpt @@ -1,17 +1,43 @@ --TEST-- -Test typed properties disallow static +Test typed static property --FILE-- ---EXPECTF-- -Fatal error: Typed property Foo::$thing must not be static in %s on line 3 - - - - +class Foo { + public static int $i; + public static string $s = "x"; +} +var_dump(Foo::$s); +Foo::$i = 1; +var_dump(Foo::$i); +Foo::$i = "1"; +var_dump(Foo::$i); +Foo::$s = Foo::$i++; +var_dump(Foo::$s, Foo::$i); +$a = 3; +$b = "3"; +Foo::$s = $a; +var_dump(Foo::$s); +Foo::$i = "4"; +var_dump(Foo::$i); +Foo::$i = ref(); +var_dump(Foo::$i); +Foo::$s = ref(); +var_dump(Foo::$s); +?> +--EXPECTF-- +string(1) "x" +int(1) +int(1) +string(1) "1" +int(2) +string(1) "3" +int(4) +int(5) +string(1) "5" 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 000000000000..2cce66d63564 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_068.phpt @@ -0,0 +1,102 @@ +--TEST-- +Test typed static property by ref +--FILE-- +getMessage()."\n"; } +var_dump($i, Foo::$i); + +try { + Foo::$i = null; +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump($i, Foo::$i); + +Foo::$s = &intRef(); +var_dump(Foo::$s, intRef()); + +Foo::$i = &stringRef(); +var_dump(Foo::$i, stringRef()); + +try { + Foo::$i = &nonNumericStringRef(); +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump(Foo::$i, nonNumericStringRef()); + +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 of type int +int(4) +int(4) +Typed property Foo::$i must be int, null used +int(4) +int(4) +string(1) "5" +int(5) +int(0) +string(1) "0" +Cannot assign string to reference of type int +int(0) +string(1) "x" +Static property and reference types int and string are not compatible +int(0) +string(1) "5" +Static property and reference types string and int are not compatible +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 000000000000..d0afa395bde2 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_069.phpt @@ -0,0 +1,28 @@ +--TEST-- +Test assign of invalid string to typed static int property +--FILE-- +getMessage()."\n"; } +try { + var_dump(Foo::$i); +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump(nonNumericStringRef()); + +?> +--EXPECTF-- +Cannot assign string to reference of type int +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 000000000000..0760db3914c8 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_070.phpt @@ -0,0 +1,50 @@ +--TEST-- +Test typed static property with assign op operators +--FILE-- +getMessage()."\n"; } +var_dump(Foo::$i); + +try { + Foo::$i .= PHP_INT_MAX; +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump(Foo::$i); + +?> +--EXPECT-- +string(2) "11" +string(2) "13" +string(2) "12" +int(1) +Typed property Foo::$i must be int, float used +int(1) +Typed property Foo::$i must be int, string used +int(1) + diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 361ea2f5ad13..111da1eff44f 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3756,15 +3756,7 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name { zend_property_info *property_info, *property_info_ptr; - if (optional_type) { - if (access_type & ZEND_ACC_STATIC) { - zend_error(ce->type == ZEND_USER_CLASS ? E_COMPILE_ERROR : E_CORE_ERROR, - "Typed property %s::$%s must not be static", - ZSTR_VAL(ce->name), - ZSTR_VAL(name)); - return FAILURE; - } - + if (optional_type && (access_type & ZEND_ACC_STATIC) == 0) { ce->ce_flags |= ZEND_ACC_HAS_TYPE_HINTS; } @@ -4155,11 +4147,12 @@ ZEND_API void zend_update_property_stringl(zend_class_entry *scope, zval *object ZEND_API int zend_update_static_property(zend_class_entry *scope, const char *name, size_t name_length, zval *value) /* {{{ */ { zval *property; + zend_property_info *prop_info; zend_class_entry *old_scope = EG(fake_scope); zend_string *key = zend_string_init(name, name_length, 0); EG(fake_scope) = scope; - property = zend_std_get_static_property(scope, key, 0); + property = zend_std_get_static_property(scope, key, 0, &prop_info); EG(fake_scope) = old_scope; zend_string_efree(key); if (!property) { @@ -4281,11 +4274,12 @@ ZEND_API zval *zend_read_property(zend_class_entry *scope, zval *object, const c ZEND_API zval *zend_read_static_property(zend_class_entry *scope, const char *name, size_t name_length, zend_bool silent) /* {{{ */ { zval *property; + zend_property_info *prop_info; zend_class_entry *old_scope = EG(fake_scope); zend_string *key = zend_string_init(name, name_length, 0); EG(fake_scope) = scope; - property = zend_std_get_static_property(scope, key, silent); + property = zend_std_get_static_property(scope, key, silent, &prop_info); EG(fake_scope) = old_scope; zend_string_efree(key); diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 6bf2b6db51b8..b9dd71185a8e 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2715,7 +2715,7 @@ static zend_op *zend_compile_prop(znode *result, zend_ast *ast, uint32_t type, i } /* }}} */ -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]; @@ -2734,7 +2734,7 @@ zend_op *zend_compile_static_prop(znode *result, zend_ast *ast, uint32_t type, i } if (opline->op1_type == IS_CONST) { convert_to_string(CT_CONSTANT(opline->op1)); - opline->extended_value = zend_alloc_polymorphic_cache_slot(); + opline->extended_value = zend_alloc_polymorphic_cache_slots(2); } if (class_node.op_type == IS_CONST) { opline->op2_type = IS_CONST; @@ -2747,6 +2747,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, type); return opline; } @@ -3096,8 +3100,12 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ opline = &CG(active_op_array)->opcodes[CG(active_op_array)->last - 1]; if (target_node.op_type == IS_VAR && opline->opcode == ZEND_FETCH_OBJ_W) { opline->opcode = ZEND_ASSIGN_OBJ_REF; + zend_make_var_result(result, opline); zend_emit_op_data(&source_node); + } else if (target_node.op_type == IS_VAR && opline->opcode == ZEND_FETCH_STATIC_PROP_W) { + opline->opcode = ZEND_ASSIGN_STATIC_PROP_REF; zend_make_var_result(result, opline); + zend_emit_op_data(&source_node); } else { opline = zend_emit_op(result, ZEND_ASSIGN_REF, &target_node, &source_node); opline->extended_value = 0; @@ -4366,7 +4374,7 @@ void zend_compile_unset(zend_ast *ast) /* {{{ */ 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() @@ -6073,13 +6081,6 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ zend_string *optional_type_name = NULL; if (type_ast) { - if (flags & ZEND_ACC_STATIC) { - zend_error_noreturn(E_COMPILE_ERROR, - "Typed property %s::$%s must not be static", - ZSTR_VAL(ce->name), - ZSTR_VAL(name)); - } - if (type_ast->attr & ZEND_TYPE_NULLABLE) { allow_null = 1; type_ast->attr &= ~ZEND_TYPE_NULLABLE; @@ -7652,7 +7653,7 @@ void zend_compile_isset_or_empty(znode *result, zend_ast *ast) /* {{{ */ 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() @@ -8486,7 +8487,7 @@ void zend_compile_var(znode *result, zend_ast *ast, uint32_t type, int by_ref) / zend_compile_prop(result, ast, type, by_ref); return; case ZEND_AST_STATIC_PROP: - zend_compile_static_prop(result, ast, type, 0); + zend_compile_static_prop(result, ast, type, by_ref, 0); return; case ZEND_AST_CALL: zend_compile_call(result, ast, type); @@ -8530,7 +8531,7 @@ void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, zend_ return; } case ZEND_AST_STATIC_PROP: - zend_compile_static_prop(result, ast, type, 1); + zend_compile_static_prop(result, ast, type, by_ref, 1); return; default: zend_compile_var(result, ast, type, 0); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 086085a4b9f7..e4117c7ffdea 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2467,10 +2467,11 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } } -static zend_never_inline int zend_fetch_static_property_address_ex(zval **retval, uint32_t cache_slot, int fetch_type OPLINE_DC EXECUTE_DATA_DC) { +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; @@ -2500,7 +2501,8 @@ static zend_never_inline int zend_fetch_static_property_address_ex(zval **retval 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*)); + *retval = CACHED_PTR(cache_slot + sizeof(void *)); + *prop_info = CACHED_PTR(cache_slot + sizeof(void *) * 2); return SUCCESS; } } @@ -2520,7 +2522,7 @@ static zend_never_inline int zend_fetch_static_property_address_ex(zval **retval } } - *retval = zend_std_get_static_property(ce, name, fetch_type == BP_VAR_IS); + *retval = zend_std_get_static_property(ce, name, fetch_type == BP_VAR_IS, &property_info); if (UNEXPECTED(op1_type != IS_CONST)) { zend_tmp_string_release(tmp_name); @@ -2536,20 +2538,50 @@ static zend_never_inline int zend_fetch_static_property_address_ex(zval **retval if (EXPECTED(op1_type == IS_CONST)) { CACHE_POLYMORPHIC_PTR(cache_slot, ce, *retval); + *prop_info = property_info; + CACHE_PTR(cache_slot + sizeof(void *) * 2, property_info); } return SUCCESS; } -static zend_always_inline int zend_fetch_static_property_address(zval **retval, uint32_t cache_slot, int fetch_type OPLINE_DC EXECUTE_DATA_DC) { +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 by_ref 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 *)); - return SUCCESS; + property_info = CACHED_PTR(cache_slot + sizeof(void *) * 2); } else { - return zend_fetch_static_property_address_ex(retval, cache_slot, fetch_type OPLINE_CC EXECUTE_DATA_CC); + 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 ((fetch_type == BP_VAR_R || fetch_type == BP_VAR_RW) && UNEXPECTED(Z_TYPE_P(*retval) == IS_UNDEF) && UNEXPECTED(property_info->type != 0)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), + "Typed static property %s::$%s must not be accessed before initialization", + ZSTR_VAL(property_info->ce->name), + ZSTR_VAL(property_info->name)); + return FAILURE; + } + + if (by_ref && UNEXPECTED(property_info) && Z_TYPE_P(*retval) != IS_REFERENCE) { + if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(*retval) <= IS_NULL)) { + zend_throw_error(NULL, "Cannot access uninitialized property by reference"); + return FAILURE; + } + ZVAL_NEW_REF(*retval, *retval); + Z_REF_P(*retval)->type = zend_get_prop_info_ref_type(property_info); + } + + if (prop_info) { + *prop_info = property_info; + } + + return SUCCESS; } ZEND_API ZEND_COLD void zend_throw_ref_type_error(zend_type type, zval *zv) { @@ -2562,6 +2594,34 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error(zend_type type, zval *zv) { ); } +static zend_always_inline zend_type zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type) { + if (!ZEND_TYPE_ALLOW_NULL(old_type)) { + ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ + } + if (ZEND_TYPE_WITHOUT_NULL(old_type) == ref_type) { + return ref_type; + } + if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { + if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { + return ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); + } else if (instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { + return ref_type; + } + } + + zend_throw_exception_ex( + zend_ce_type_error, ZEND_TYPE_IS_CLASS(ref_type) ? IS_OBJECT : ZEND_TYPE_CODE(ref_type), + "%s and reference types %s%s and %s%s are not compatible", + source, + ZEND_TYPE_ALLOW_NULL(ref_type) ? "?" : "", + ZEND_TYPE_IS_CLASS(ref_type) ? ZSTR_VAL(ZEND_TYPE_CE(ref_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(ref_type)), + ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", + ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) + ); + return 0; +} + + static zend_never_inline void zend_fetch_this_var(int type OPLINE_DC EXECUTE_DATA_DC) { zval *result = EX_VAR(opline->result.var); diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 1c50d854e990..c9f4af5246bc 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -1399,23 +1399,23 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_st } /* }}} */ -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(zend_class_entry *ce, zend_string *property_name, zend_bool silent, zend_property_info **property_info) /* {{{ */ { - zend_property_info *property_info = zend_hash_find_ptr(&ce->properties_info, property_name); zval *ret; + *property_info = zend_hash_find_ptr(&ce->properties_info, property_name); - if (UNEXPECTED(property_info == NULL)) { + if (UNEXPECTED(*property_info == NULL)) { goto undeclared_property; } - if (UNEXPECTED(!zend_verify_property_access(property_info, ce))) { + 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)); + zend_throw_error(NULL, "Cannot access %s property %s::$%s", zend_visibility_string((*property_info)->flags), ZSTR_VAL(ce->name), ZSTR_VAL(property_name)); } return NULL; } - if (UNEXPECTED((property_info->flags & ZEND_ACC_STATIC) == 0)) { + if (UNEXPECTED(((*property_info)->flags & ZEND_ACC_STATIC) == 0)) { goto undeclared_property; } @@ -1424,7 +1424,7 @@ ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *p return NULL; } } - ret = CE_STATIC_MEMBERS(ce) + property_info->offset; + ret = CE_STATIC_MEMBERS(ce) + (*property_info)->offset; /* check if static properties were destoyed */ if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index 1dfed715f353..0521b11c861e 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -174,7 +174,7 @@ extern const ZEND_API zend_object_handlers std_object_handlers; ((fbc)->common.prototype ? (fbc)->common.prototype->common.scope : (fbc)->common.scope) 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(zend_class_entry *ce, zend_string *property_name, zend_bool silent, struct _zend_property_info **prop_info); 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); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 2731d6c49f6c..84de15cc203c 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -792,7 +792,7 @@ ZEND_VM_COLD_HELPER(zend_undefined_function_helper, ANY, ANY, zval *function_nam ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, binary_op_type binary_op) { USE_OPLINE - zend_free_op free_op1, free_op2, free_op_data1; + zend_free_op free_op1, free_op2, free_op_data; zval *object; zval *property; zval *value; @@ -810,7 +810,7 @@ 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)) { @@ -876,7 +876,7 @@ ZEND_VM_C_LABEL(assign_op_object): } } while (0); - FREE_OP(free_op_data1); + FREE_OP_DATA(); FREE_OP2(); FREE_OP1_VAR_PTR(); /* assign_obj has two opcodes! */ @@ -890,12 +890,14 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP_DATA(); HANDLE_EXCEPTION(); } @@ -904,10 +906,35 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE SEPARATE_ZVAL_NOREF(prop); value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP_DATA(); @@ -1809,7 +1836,7 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -1832,7 +1859,7 @@ ZEND_VM_HANDLER(173, ZEND_FETCH_STATIC_PROP_R, CONST|TMPVAR|CV, UNUSED|CLASS_FET ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_R); } -ZEND_VM_HANDLER(174, ZEND_FETCH_STATIC_PROP_W, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT) +ZEND_VM_HANDLER(174, ZEND_FETCH_STATIC_PROP_W, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, FETCH_REF|CACHE_SLOT) { ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_W); } @@ -1842,7 +1869,7 @@ ZEND_VM_HANDLER(175, ZEND_FETCH_STATIC_PROP_RW, CONST|TMPVAR|CV, UNUSED|CLASS_FE ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_RW); } -ZEND_VM_HANDLER(177, ZEND_FETCH_STATIC_PROP_FUNC_ARG, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT) +ZEND_VM_HANDLER(177, ZEND_FETCH_STATIC_PROP_FUNC_ARG, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, FETCH_REF|CACHE_SLOT) { int fetch_type = (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ? @@ -2459,17 +2486,44 @@ ZEND_VM_HANDLER(200, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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(); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((OP_DATA_TYPE & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + FREE_OP_DATA(); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((OP_DATA_TYPE & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -2678,7 +2732,6 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); FREE_OP1_VAR_PTR(); FREE_OP2(); @@ -2718,32 +2771,13 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_OP_DATA_VAR_PTR(); + HANDLE_EXCEPTION(); } } } @@ -2773,6 +2807,69 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C ZEND_VM_NEXT_OPCODE_EX(1, 2); } +ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT|SRC, SPEC(OP_DATA=VAR|CV)) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + FREE_UNFETCHED_OP_DATA(); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = GET_OP_DATA_ZVAL_PTR_PTR(BP_VAR_W); + + if (OP_DATA_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (OP_DATA_TYPE == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC))) { + FREE_OP_DATA_VAR_PTR(); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + FREE_OP_DATA_VAR_PTR(); + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + FREE_OP_DATA_VAR_PTR(); + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + 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; @@ -6606,7 +6703,7 @@ ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLA SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + 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 && diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index b4f04d01d305..c066e0bd24f9 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4527,12 +4527,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -4541,10 +4543,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -4653,7 +4680,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -4993,17 +5020,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -5018,17 +5072,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -5043,17 +5124,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -5068,17 +5176,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -5089,6 +5224,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -5796,7 +6056,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + 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 && @@ -6841,12 +7101,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -6855,10 +7117,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -8081,7 +8368,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -8136,17 +8423,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8161,17 +8475,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8186,17 +8527,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8211,17 +8579,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8232,6 +8627,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -8294,7 +8814,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + 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 && @@ -8452,12 +8972,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -8466,10 +8988,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -8697,7 +9244,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -8767,17 +9314,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8792,17 +9366,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8817,17 +9418,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8842,17 +9470,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8863,6 +9518,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -9381,7 +10161,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + 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 && @@ -13706,7 +14486,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -14005,17 +14785,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -14030,17 +14837,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -14055,17 +14889,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -14080,17 +14941,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -14101,6 +14989,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -14467,7 +15480,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + 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 && @@ -16058,7 +17071,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -16113,17 +17126,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -16138,17 +17178,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -16163,17 +17230,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -16188,17 +17282,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -16209,6 +17330,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -16271,7 +17517,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + 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 && @@ -16460,7 +17706,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -16515,17 +17761,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -16540,17 +17813,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -16565,17 +17865,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -16590,17 +17917,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -16611,6 +17965,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -16754,7 +18233,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + 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 && @@ -18661,12 +20140,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -18675,10 +20156,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -19200,12 +20706,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -19214,10 +20722,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -19872,12 +21405,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -19886,10 +21421,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -22552,7 +24112,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONS static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op1, free_op_data1; + zend_free_op free_op1, free_op_data; zval *object; zval *property; zval *value; @@ -22570,7 +24130,7 @@ 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)) { @@ -22636,7 +24196,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } 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! */ @@ -22650,12 +24210,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -22664,10 +24226,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -24650,7 +26237,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -24690,32 +26276,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -24778,7 +26345,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -24818,32 +26384,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + HANDLE_EXCEPTION(); } } } @@ -25506,7 +27053,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_VAR_CONST_HANDLE static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op1, free_op2, free_op_data1; + zend_free_op free_op1, free_op2, free_op_data; zval *object; zval *property; zval *value; @@ -25524,7 +27071,7 @@ 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)) { @@ -25590,7 +27137,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } 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! */ @@ -25604,12 +27151,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -25618,10 +27167,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -27553,7 +29127,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); @@ -27593,32 +29166,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -27681,7 +29235,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); @@ -27721,32 +29274,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); } } } @@ -28675,12 +30209,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -28689,10 +30225,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -30059,7 +31620,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_TYPE_SPEC_VAR_UNUSED_HANDL static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op1, free_op_data1; + zend_free_op free_op1, free_op_data; zval *object; zval *property; zval *value; @@ -30077,7 +31638,7 @@ 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)) { @@ -30143,7 +31704,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } 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! */ @@ -32079,7 +33640,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -32119,32 +33679,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -32207,7 +33748,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -32247,32 +33787,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + HANDLE_EXCEPTION(); } } } @@ -33117,7 +34638,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_H static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op_data1; + zend_free_op free_op_data; zval *object; zval *property; zval *value; @@ -33135,7 +34656,7 @@ 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)) { @@ -33201,7 +34722,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); /* assign_obj has two opcodes! */ @@ -34441,7 +35962,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON 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"); @@ -34481,32 +36001,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -34568,7 +36069,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON 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"); @@ -34608,32 +36108,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + + + HANDLE_EXCEPTION(); } } } @@ -35345,7 +36826,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLE static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op2, free_op_data1; + zend_free_op free_op2, free_op_data; zval *object; zval *property; zval *value; @@ -35363,7 +36844,7 @@ 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)) { @@ -35429,7 +36910,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); zval_ptr_dtor_nogc(free_op2); /* assign_obj has two opcodes! */ @@ -36673,7 +38154,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); zval_ptr_dtor_nogc(free_op2); @@ -36713,32 +38193,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -36800,7 +38261,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); zval_ptr_dtor_nogc(free_op2); @@ -36840,32 +38300,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); } } } @@ -38206,7 +39647,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUS static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op_data1; + zend_free_op free_op_data; zval *object; zval *property; zval *value; @@ -38224,7 +39665,7 @@ 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)) { @@ -38290,7 +39731,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); /* assign_obj has two opcodes! */ @@ -39530,7 +40971,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ 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"); @@ -39570,32 +41010,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -39657,7 +41078,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ 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"); @@ -39697,32 +41117,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + + + HANDLE_EXCEPTION(); } } } @@ -42756,7 +44157,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CONST_HANDLER static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op_data1; + zend_free_op free_op_data; zval *object; zval *property; zval *value; @@ -42774,7 +44175,7 @@ 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)) { @@ -42840,7 +44241,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); /* assign_obj has two opcodes! */ @@ -42854,12 +44255,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -42868,10 +44271,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -43688,7 +45116,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -44721,17 +46149,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -44746,17 +46201,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -44771,17 +46253,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -44796,17 +46305,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -45256,7 +46792,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O 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"); @@ -45296,32 +46831,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -45383,7 +46899,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O 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"); @@ -45423,32 +46938,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + + + HANDLE_EXCEPTION(); } } } @@ -45477,6 +46973,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -46028,7 +47649,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + 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 && @@ -47263,7 +48884,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_TMPVAR_HANDLE static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op2, free_op_data1; + zend_free_op free_op2, free_op_data; zval *object; zval *property; zval *value; @@ -47281,7 +48902,7 @@ 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)) { @@ -47347,7 +48968,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); zval_ptr_dtor_nogc(free_op2); /* assign_obj has two opcodes! */ @@ -47361,12 +48982,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -47375,10 +48998,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -49556,7 +51204,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); zval_ptr_dtor_nogc(free_op2); @@ -49596,32 +51243,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -49683,7 +51311,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); zval_ptr_dtor_nogc(free_op2); @@ -49723,32 +51350,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); } } } @@ -50655,7 +52263,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -50710,17 +52318,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -50735,17 +52370,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -50760,17 +52422,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -50785,17 +52474,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -50911,6 +52627,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -50973,7 +52814,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + 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 && @@ -51180,12 +53021,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -51194,10 +53037,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -51630,7 +53498,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -51734,17 +53602,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -51759,17 +53654,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -51784,17 +53706,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + 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)); - ZVAL_UNDEF(EX_VAR(opline->result.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)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -51809,17 +53758,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -52180,6 +54156,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + 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) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &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(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -52557,7 +54658,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + 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 && @@ -53581,7 +55682,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CV_HANDLER(ZE static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op_data1; + zend_free_op free_op_data; zval *object; zval *property; zval *value; @@ -53599,7 +55700,7 @@ 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)) { @@ -53665,7 +55766,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); /* assign_obj has two opcodes! */ @@ -55845,7 +57946,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D 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"); @@ -55885,32 +57985,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -55972,7 +58053,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D 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"); @@ -56012,32 +58092,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + + + HANDLE_EXCEPTION(); } } } @@ -60439,6 +62500,131 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_JMP_FORWARD_SPEC_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -62045,6 +64231,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CONST_CONST): VM_TRACE(ZEND_FAST_CONCAT_SPEC_CONST_CONST) ZEND_FAST_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -62369,6 +64563,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV_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); @@ -62497,6 +64699,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED): VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED) ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -63225,6 +65435,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST): VM_TRACE(ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST) ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -63413,6 +65631,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_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); @@ -63489,6 +65715,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_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); @@ -66447,6 +68681,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV) ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_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); @@ -66999,6 +69241,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_REF_SPEC_CV_VAR) ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV_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); @@ -67203,6 +69453,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV) ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED): VM_TRACE(ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED) ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -71306,6 +73564,131 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_JMP_FORWARD_SPEC_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -72401,7 +74784,8 @@ void zend_vm_init(void) 3322 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 3347 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, 3472 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 4488 + 3597 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 4613 }; #if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) zend_opcode_handler_funcs = labels; @@ -72604,7 +74988,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 = 3598 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3723 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -72612,7 +74996,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 = 3623 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3748 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -72620,7 +75004,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 = 3648 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3773 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -72631,17 +75015,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 = 3673 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3798 | 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 = 3698 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3823 | 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 = 3723 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3848 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_MUL: @@ -72652,17 +75036,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 = 3748 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3873 | 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 = 3773 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3898 | 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 = 3798 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3923 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_EQUAL: @@ -72673,12 +75057,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 = 3823 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 3948 | 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 = 3898 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4023 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_NOT_EQUAL: @@ -72689,12 +75073,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 = 3973 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4098 | 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 = 4048 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4173 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_SMALLER: @@ -72702,12 +75086,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 = 4123 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4248 | 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 = 4198 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4323 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_IS_SMALLER_OR_EQUAL: @@ -72715,70 +75099,70 @@ 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 = 4273 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4398 | 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 = 4348 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4473 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_QM_ASSIGN: if (op1_info == MAY_BE_DOUBLE) { - spec = 4441 | SPEC_RULE_OP1; + spec = 4566 | SPEC_RULE_OP1; } else if (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)))) { - spec = 4446 | SPEC_RULE_OP1; + spec = 4571 | SPEC_RULE_OP1; } break; case ZEND_PRE_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4423 | SPEC_RULE_RETVAL; + spec = 4548 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 4425 | SPEC_RULE_RETVAL; + spec = 4550 | SPEC_RULE_RETVAL; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4427 | SPEC_RULE_RETVAL; + spec = 4552 | SPEC_RULE_RETVAL; } break; case ZEND_PRE_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4429 | SPEC_RULE_RETVAL; + spec = 4554 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 4431 | SPEC_RULE_RETVAL; + spec = 4556 | SPEC_RULE_RETVAL; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4433 | SPEC_RULE_RETVAL; + spec = 4558 | SPEC_RULE_RETVAL; } break; case ZEND_POST_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4435; + spec = 4560; } else if (op1_info == MAY_BE_LONG) { - spec = 4436; + spec = 4561; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4437; + spec = 4562; } break; case ZEND_POST_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4438; + spec = 4563; } else if (op1_info == MAY_BE_LONG) { - spec = 4439; + spec = 4564; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4440; + spec = 4565; } break; case ZEND_JMP: if (OP_JMP_ADDR(op, op->op1) > op) { - spec = 3597; + spec = 3722; } break; case ZEND_SEND_VAR_EX: if (op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4481 | SPEC_RULE_OP1; + spec = 4606 | 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 = 4486 | SPEC_RULE_RETVAL; + spec = 4611 | SPEC_RULE_RETVAL; } break; case ZEND_FETCH_DIM_R: @@ -72786,12 +75170,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 = 4451 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4576 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_SEND_VAR: if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4476 | SPEC_RULE_OP1; + spec = 4601 | SPEC_RULE_OP1; } break; case ZEND_BW_OR: diff --git a/Zend/zend_vm_handlers.h b/Zend/zend_vm_handlers.h index 816bdfff9e2d..b00a106ffe4a 100644 --- a/Zend/zend_vm_handlers.h +++ b/Zend/zend_vm_handlers.h @@ -1833,493 +1833,517 @@ _(3588, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_TMP) \ _(3589, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_VAR) \ _(3591, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CV) \ - _(3597, ZEND_JMP_FORWARD_SPEC) \ - _(3603, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3604, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3605, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3607, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3608, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3609, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3610, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3612, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3618, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3619, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3620, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3622, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3628, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3629, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3630, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3632, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3633, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3634, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3635, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3637, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3643, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3644, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3645, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3647, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3653, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3654, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3655, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3657, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3658, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3659, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3660, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3662, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3668, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3669, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3670, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3672, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3674, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3675, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3677, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3678, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3679, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3680, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3682, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3683, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3684, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3685, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3687, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3693, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3694, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3695, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3697, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3699, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3700, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3702, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3703, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3704, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3705, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3707, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3708, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3709, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3710, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3712, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3718, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3719, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3720, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3722, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3724, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3725, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3727, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3728, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3729, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3730, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3732, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3733, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3734, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3735, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3737, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3743, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3744, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3745, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3747, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3753, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3754, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3755, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3757, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3758, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3759, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3760, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3762, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3768, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3769, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3770, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3772, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3778, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(3779, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3780, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3782, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3783, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(3784, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3785, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3787, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3793, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(3794, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3795, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3797, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3803, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3804, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3805, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3807, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3808, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3809, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3810, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3812, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3818, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3819, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3820, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3822, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3838, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3839, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3840, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3841, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3842, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3843, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3844, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3845, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3846, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3850, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3851, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3852, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3853, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3854, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3855, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3856, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3857, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3858, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3859, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3860, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3861, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3865, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3866, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3867, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3883, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3884, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3885, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3886, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3887, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3888, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3889, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3890, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3891, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3895, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3896, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3897, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3913, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3914, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3915, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3916, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3917, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3918, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3919, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3920, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3921, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3925, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3926, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3927, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3928, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3929, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3930, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3931, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3932, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3933, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3934, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3935, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3936, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3940, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3941, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3942, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3958, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3959, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3960, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3961, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3962, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3963, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3964, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3965, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3966, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3970, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3971, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3972, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3988, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3989, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3990, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3991, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3992, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3993, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3994, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3995, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3996, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4000, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4001, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4002, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4003, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4004, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4005, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4006, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4007, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4008, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4009, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4010, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4011, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4015, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4016, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4017, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4033, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4034, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4035, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4036, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4037, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4038, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4039, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4040, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4041, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4045, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4046, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4047, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4063, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4064, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4065, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4066, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4067, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4068, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4069, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4070, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4071, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4075, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4076, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4077, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4078, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4079, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4080, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4081, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4082, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4083, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4084, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4085, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4086, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4090, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4091, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4092, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4108, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4109, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4110, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4111, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4112, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4113, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4114, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4115, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4116, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4120, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4121, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4122, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4126, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4127, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4128, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4129, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4130, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4131, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4135, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4136, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4137, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4138, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4139, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4140, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4141, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4142, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4143, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4144, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4145, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4146, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4150, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4151, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4152, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4153, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4154, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4155, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4156, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4157, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4158, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4159, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4160, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4161, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4165, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4166, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4167, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4183, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4184, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4185, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4186, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4187, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4188, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4189, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4190, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4191, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4195, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4196, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4197, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4201, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4202, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4203, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4204, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4205, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4206, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4210, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4211, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4212, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4213, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4214, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4215, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4216, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4217, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4218, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4219, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4220, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4221, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4225, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4226, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4227, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4228, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4229, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4230, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4231, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4232, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4233, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4234, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4235, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4236, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4240, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4241, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4242, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4258, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4259, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4260, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4261, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4262, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4263, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4264, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4265, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4266, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4270, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4271, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4272, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4276, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4277, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4278, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4279, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4280, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4281, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4285, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4286, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4287, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4288, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4289, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4290, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4291, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4292, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4293, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4294, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4295, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4296, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4300, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4301, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4302, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4303, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4304, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4305, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4306, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4307, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4308, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4309, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4310, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4311, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4315, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4316, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4317, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4333, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4334, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4335, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4336, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4337, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4338, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4339, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4340, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4341, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4345, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4346, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4347, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4351, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4352, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4353, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4354, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4355, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4356, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4360, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4361, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4362, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4363, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4364, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4365, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4366, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4367, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4368, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4369, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4370, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4371, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4375, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4376, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4377, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4378, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4379, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4380, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4381, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4382, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4383, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4384, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4385, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4386, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4390, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4391, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4392, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4408, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4409, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4410, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4411, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4412, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4413, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4414, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4415, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4416, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4420, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4421, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4422, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4423, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4424, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ - _(4425, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4426, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ - _(4427, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4428, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ - _(4429, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4430, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ - _(4431, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4432, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ - _(4433, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4434, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ - _(4435, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ - _(4436, ZEND_POST_INC_LONG_SPEC_TMPVARCV) \ - _(4437, ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ - _(4438, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ - _(4439, ZEND_POST_DEC_LONG_SPEC_TMPVARCV) \ - _(4440, ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ - _(4441, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ - _(4442, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4443, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4445, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4446, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ - _(4447, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4448, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4450, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4452, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4453, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4455, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4456, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(4457, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4458, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4460, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4461, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(4462, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4463, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4465, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4471, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ - _(4472, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4473, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4475, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4478, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ - _(4480, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ - _(4483, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR) \ - _(4485, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV) \ - _(4486, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ - _(4487, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ - _(4487+1, ZEND_NULL) + _(3599, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR) \ + _(3601, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV) \ + _(3609, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR) \ + _(3611, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV) \ + _(3614, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR) \ + _(3616, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV) \ + _(3624, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR) \ + _(3626, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV) \ + _(3634, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR) \ + _(3636, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV) \ + _(3639, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR) \ + _(3641, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV) \ + _(3649, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR) \ + _(3651, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV) \ + _(3659, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR) \ + _(3661, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV) \ + _(3664, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR) \ + _(3666, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV) \ + _(3699, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR) \ + _(3701, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV) \ + _(3709, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR) \ + _(3711, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV) \ + _(3714, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR) \ + _(3716, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV) \ + _(3722, ZEND_JMP_FORWARD_SPEC) \ + _(3728, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3729, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3730, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3732, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3733, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3734, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3735, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3737, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3743, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3744, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3745, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3747, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3753, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3754, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3755, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3757, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3758, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3759, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3760, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3762, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3768, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3769, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3770, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3772, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3778, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3779, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3780, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3782, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3783, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3784, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3785, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3787, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3793, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3794, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3795, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3797, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3799, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3800, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3802, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3803, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3804, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3805, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3807, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3808, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3809, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3810, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3812, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3818, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3819, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3820, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3822, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3824, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3825, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3827, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3828, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3829, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3830, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3832, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3833, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3834, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3835, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3837, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3843, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3844, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3845, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3847, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3849, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3850, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3852, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3853, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3854, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3855, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3857, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3858, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3859, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3860, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3862, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3868, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3869, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3870, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3872, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3878, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3879, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3880, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3882, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3883, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3884, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3885, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3887, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3893, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3894, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3895, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3897, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3903, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(3904, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3905, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3907, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3908, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(3909, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3910, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3912, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3918, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(3919, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3920, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3922, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3928, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3929, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3930, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3932, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3933, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3934, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3935, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3937, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3943, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3944, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3945, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3947, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3963, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3964, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3965, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3966, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3967, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3968, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3969, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3970, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3971, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3975, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3976, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3977, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3978, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3979, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3980, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3981, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3982, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3983, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3984, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3985, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3986, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3990, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3991, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3992, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4008, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4009, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4010, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4011, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4012, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4013, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4014, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4015, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4016, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4020, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4021, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4022, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4038, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4039, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4040, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4041, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4042, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4043, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4044, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4045, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4046, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4050, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4051, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4052, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4053, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4054, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4055, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4056, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4057, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4058, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4059, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4060, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4061, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4065, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4066, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4067, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4083, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4084, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4085, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4086, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4087, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4088, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4089, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4090, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4091, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4095, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4096, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4097, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4113, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4114, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4115, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4116, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4117, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4118, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4119, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4120, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4121, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4125, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4126, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4127, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4128, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4129, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4130, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4131, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4132, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4133, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4134, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4135, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4136, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4140, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4141, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4142, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4158, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4159, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4160, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4161, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4162, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4163, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4164, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4165, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4166, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4170, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4171, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4172, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4188, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4189, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4190, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4191, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4192, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4193, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4194, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4195, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4196, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4200, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4201, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4202, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4203, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4204, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4205, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4206, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4207, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4208, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4209, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4210, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4211, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4215, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4216, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4217, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4233, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4234, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4235, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4236, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4237, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4238, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4239, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4240, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4241, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4245, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4246, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4247, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4251, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4252, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4253, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4254, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4255, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4256, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4260, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4261, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4262, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4263, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4264, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4265, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4266, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4267, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4268, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4269, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4270, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4271, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4275, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4276, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4277, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4278, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4279, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4280, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4281, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4282, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4283, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4284, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4285, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4286, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4290, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4291, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4292, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4308, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4309, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4310, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4311, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4312, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4313, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4314, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4315, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4316, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4320, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4321, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4322, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4326, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4327, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4328, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4329, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4330, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4331, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4335, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4336, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4337, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4338, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4339, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4340, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4341, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4342, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4343, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4344, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4345, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4346, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4350, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4351, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4352, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4353, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4354, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4355, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4356, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4357, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4358, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4359, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4360, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4361, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4365, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4366, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4367, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4383, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4384, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4385, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4386, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4387, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4388, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4389, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4390, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4391, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4395, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4396, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4397, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4401, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4402, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4403, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4404, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4405, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4406, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4410, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4411, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4412, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4413, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4414, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4415, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4416, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4417, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4418, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4419, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4420, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4421, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4425, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4426, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4427, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4428, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4429, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4430, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4431, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4432, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4433, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4434, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4435, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4436, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4440, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4441, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4442, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4458, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4459, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4460, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4461, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4462, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4463, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4464, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4465, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4466, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4470, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4471, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4472, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4476, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4477, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4478, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4479, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4480, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4481, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4485, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4486, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4487, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4488, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4489, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4490, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4491, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4492, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4493, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4494, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4495, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4496, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4500, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4501, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4502, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4503, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4504, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4505, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4506, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4507, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4508, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4509, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4510, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4511, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4515, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4516, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4517, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4533, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4534, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4535, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4536, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4537, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4538, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4539, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4540, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4541, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4545, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4546, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4547, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4548, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4549, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ + _(4550, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4551, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ + _(4552, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4553, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ + _(4554, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4555, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ + _(4556, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4557, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ + _(4558, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4559, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ + _(4560, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ + _(4561, ZEND_POST_INC_LONG_SPEC_TMPVARCV) \ + _(4562, ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ + _(4563, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ + _(4564, ZEND_POST_DEC_LONG_SPEC_TMPVARCV) \ + _(4565, ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ + _(4566, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ + _(4567, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4568, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4570, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4571, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ + _(4572, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4573, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4575, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4577, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4578, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4580, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4581, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(4582, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4583, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4585, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4586, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(4587, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4588, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4590, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4596, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ + _(4597, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4598, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4600, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4603, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ + _(4605, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ + _(4608, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR) \ + _(4610, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV) \ + _(4611, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ + _(4612, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ + _(4612+1, ZEND_NULL) diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 09cfc9cc7fb3..fa478c5343db 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -22,7 +22,7 @@ #include #include -static const char *zend_vm_opcodes_names[201] = { +static const char *zend_vm_opcodes_names[202] = { "ZEND_NOP", "ZEND_ADD", "ZEND_SUB", @@ -224,9 +224,10 @@ static const char *zend_vm_opcodes_names[201] = { "ZEND_FETCH_LIST_W", "ZEND_ASSIGN_OBJ_REF", "ZEND_ASSIGN_STATIC_PROP", + "ZEND_ASSIGN_STATIC_PROP_REF", }; -static uint32_t zend_vm_opcodes_flags[201] = { +static uint32_t zend_vm_opcodes_flags[202] = { 0x00000000, 0x00000707, 0x00000707, @@ -401,10 +402,10 @@ static uint32_t zend_vm_opcodes_flags[201] = { 0x03000000, 0x03000100, 0x00047307, + 0x00247307, 0x00047307, 0x00047307, - 0x00047307, - 0x00047307, + 0x00247307, 0x00047307, 0x00047307, 0x00067307, @@ -428,6 +429,7 @@ static uint32_t zend_vm_opcodes_flags[201] = { 0x00000701, 0x0b040751, 0x00040307, + 0x0b040307, }; 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 bd6d2cad49ad..6429d32f3ed9 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -276,7 +276,8 @@ END_EXTERN_C() #define ZEND_FETCH_LIST_W 198 #define ZEND_ASSIGN_OBJ_REF 199 #define ZEND_ASSIGN_STATIC_PROP 200 +#define ZEND_ASSIGN_STATIC_PROP_REF 201 -#define ZEND_VM_LAST_OPCODE 200 +#define ZEND_VM_LAST_OPCODE 201 #endif diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index f61fecbef1cf..753654938fe8 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3924,6 +3924,7 @@ ZEND_METHOD(reflection_class, getStaticPropertyValue) { reflection_object *intern; zend_class_entry *ce; + zend_property_info *prop_info; zend_string *name; zval *prop, *def_value = NULL; @@ -3936,7 +3937,7 @@ ZEND_METHOD(reflection_class, getStaticPropertyValue) if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) { return; } - prop = zend_std_get_static_property(ce, name, 1); + prop = zend_std_get_static_property(ce, name, 1, &prop_info); if (!prop) { if (def_value) { ZVAL_COPY(return_value, def_value); @@ -3958,6 +3959,7 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) { reflection_object *intern; zend_class_entry *ce; + zend_property_info *prop_info; zend_string *name; zval *variable_ptr, *value; @@ -3970,15 +3972,21 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) { return; } - variable_ptr = zend_std_get_static_property(ce, name, 1); + variable_ptr = zend_std_get_static_property(ce, name, 1, &prop_info); if (!variable_ptr) { zend_throw_exception_ex(reflection_exception_ptr, 0, "Class %s does not have a property named %s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); return; } ZVAL_DEREF(variable_ptr); - zval_ptr_dtor(variable_ptr); - ZVAL_COPY(variable_ptr, value); + + if (zend_verify_property_type(prop_info, value, value, EX_USES_STRICT_TYPES())) { + zval_ptr_dtor(variable_ptr); + ZVAL_COPY(variable_ptr, value); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, value); + } + } /* }}} */ From ea586001d4d2c919c6799209b37274076f97b646 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 14 Jun 2018 17:35:09 +0200 Subject: [PATCH 244/369] Fix assign to typed ref with weak type conversion Thanks to @nikic for the test --- .../typed_properties_071.phpt | 36 +++++++++++++++++++ Zend/zend_execute.h | 20 +++++++---- 2 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_071.phpt 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 000000000000..4d0451cf73f7 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_071.phpt @@ -0,0 +1,36 @@ +--TEST-- +Test assignment to typed reference with weak type conversion +--FILE-- +x = &$y; +var_dump($y, $test); + +$z = 42; +$y = $z; +var_dump($y, $z, $test); + +?> +--EXPECT-- +object(Test)#1 (1) { + ["x"]=> + string(1) "x" +} +string(1) "y" +object(Test)#1 (1) { + ["x"]=> + &string(1) "y" +} +string(2) "42" +int(42) +object(Test)#1 (1) { + ["x"]=> + &string(2) "42" +} diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index a8bbd4773584..42a7605c8d47 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -98,13 +98,19 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval zend_refcounted *garbage; if (Z_ISREF_P(variable_ptr)) { - if (ZEND_CONST_COND(value_type == IS_CONST, 1)) { - ZVAL_COPY_VALUE(&tmp, value); - value = &tmp; - } - if (!zend_verify_ref_type_assignable_zval(Z_REFTYPE_P(variable_ptr), value, strict)) { - zend_throw_ref_type_error(Z_REFTYPE_P(variable_ptr), value); - return Z_REFVAL_P(variable_ptr); + if (UNEXPECTED(Z_REFTYPE_P(variable_ptr))) { + zend_bool need_copy = (value_type & (IS_CONST|IS_CV)) || ((value_type & IS_VAR) && UNEXPECTED(ref) && Z_REFCOUNT_P(variable_ptr) > 1); + if (need_copy) { + ZVAL_COPY(&tmp, value); + value = &tmp; + } + if (!zend_verify_ref_type_assignable_zval(Z_REFTYPE_P(variable_ptr), value, strict)) { + zend_throw_ref_type_error(Z_REFTYPE_P(variable_ptr), value); + return Z_REFVAL_P(variable_ptr); + } + if (need_copy) { + Z_TRY_DELREF_P(value); + } } variable_ptr = Z_REFVAL_P(variable_ptr); From 149fd4bee5eda4b59d1eedd199fee1d644a0b028 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 14 Jun 2018 23:58:49 +0200 Subject: [PATCH 245/369] Fix opcache for typed static properties --- ext/opcache/Optimizer/compact_literals.c | 91 ++++++++++++------------ ext/opcache/Optimizer/zend_optimizer.c | 9 +-- 2 files changed, 52 insertions(+), 48 deletions(-) diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index 60e7d5f6b4a7..5717fa22cc5d 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -107,7 +107,7 @@ static uint32_t add_static_slot(HashTable *hash, ret = Z_LVAL_P(pos); } else { ret = *cache_size; - *cache_size += 2 * sizeof(void *); + *cache_size += (kind == LITERAL_STATIC_PROPERTY ? 3 : 2) * sizeof(void *); ZVAL_LONG(&tmp, ret); zend_hash_add(hash, key, &tmp); } @@ -183,6 +183,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx LITERAL_INFO(opline->op2.constant, LITERAL_CLASS_CONST, 1); break; case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_STATIC_PROP_REF: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: @@ -191,7 +192,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: case ZEND_ISSET_ISEMPTY_STATIC_PROP: -handle_static_prop: +literals_handle_static_prop: if (opline->op2_type == IS_CONST) { LITERAL_INFO(opline->op2.constant, LITERAL_CLASS, 2); } @@ -243,7 +244,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_ASSIGN_BW_AND: case ZEND_ASSIGN_BW_XOR: if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { - goto handle_static_prop; + goto literals_handle_static_prop; } if (opline->op2_type == IS_CONST) { if (opline->extended_value == ZEND_ASSIGN_OBJ) { @@ -494,19 +495,42 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_ASSIGN_BW_OR: case ZEND_ASSIGN_BW_AND: case ZEND_ASSIGN_BW_XOR: - if (opline->extended_value != ZEND_ASSIGN_OBJ) { - break; + if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + if (opline->op1_type == IS_CONST) { + // op1 static property + if (opline->op2_type == IS_CONST) { + (opline+1)->extended_value = add_static_slot(&hash, op_array, + opline->op2.constant, + opline->op1.constant, + LITERAL_STATIC_PROPERTY, + &cache_size) | ((opline+1)->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + } else { + (opline+1)->extended_value = cache_size | ((opline+1)->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + cache_size += 3 * sizeof(void *); + } + } else if (opline->op2_type == IS_CONST) { + // op2 class + if (class_slot[opline->op2.constant] >= 0) { + (opline+1)->extended_value = class_slot[opline->op2.constant] | ((opline+1)->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + } else { + (opline+1)->extended_value = cache_size | ((opline+1)->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + class_slot[opline->op2.constant] = cache_size; + cache_size += sizeof(void *); + } + } } - if (opline->op2_type == IS_CONST) { - // op2 property - if (opline->op1_type == IS_UNUSED && - property_slot[opline->op2.constant] >= 0) { - (opline+1)->extended_value = property_slot[opline->op2.constant]; - } else { - (opline+1)->extended_value = cache_size; - cache_size += 3 * sizeof(void *); - if (opline->op1_type == IS_UNUSED) { - property_slot[opline->op2.constant] = (opline+1)->extended_value; + if (opline->extended_value == ZEND_ASSIGN_OBJ) { + if (opline->op2_type == IS_CONST) { + // op2 property + if (opline->op1_type == IS_UNUSED && + property_slot[opline->op2.constant] >= 0) { + (opline+1)->extended_value = property_slot[opline->op2.constant]; + } else { + (opline+1)->extended_value = cache_size; + cache_size += 3 * sizeof(void *); + if (opline->op1_type == IS_UNUSED) { + property_slot[opline->op2.constant] = (opline+1)->extended_value; + } } } } @@ -637,6 +661,8 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx cache_size += 2 * sizeof(void *); } break; + case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_STATIC_PROP_REF: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: @@ -644,29 +670,6 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_FETCH_STATIC_PROP_UNSET: case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: - if (opline->op1_type == IS_CONST) { - // op1 static property - if (opline->op2_type == IS_CONST) { - opline->extended_value = add_static_slot(&hash, op_array, - opline->op2.constant, - opline->op1.constant, - LITERAL_STATIC_PROPERTY, - &cache_size); - } else { - opline->extended_value = cache_size; - cache_size += 2 * sizeof(void *); - } - } else if (opline->op2_type == IS_CONST) { - // op2 class - if (class_slot[opline->op2.constant] >= 0) { - opline->extended_value = class_slot[opline->op2.constant]; - } else { - opline->extended_value = cache_size; - cache_size += sizeof(void *); - class_slot[opline->op2.constant] = opline->extended_value; - } - } - break; case ZEND_ISSET_ISEMPTY_STATIC_PROP: if (opline->op1_type == IS_CONST) { // op1 static property @@ -675,19 +678,19 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx opline->op2.constant, opline->op1.constant, LITERAL_STATIC_PROPERTY, - &cache_size) | (opline->extended_value & ZEND_ISEMPTY); + &cache_size) | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); } else { - opline->extended_value = cache_size | (opline->extended_value & ZEND_ISEMPTY); - cache_size += 2 * sizeof(void *); + opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + cache_size += 3 * sizeof(void *); } } else if (opline->op2_type == IS_CONST) { // op2 class if (class_slot[opline->op2.constant] >= 0) { - opline->extended_value = class_slot[opline->op2.constant] | (opline->extended_value & ZEND_ISEMPTY); + opline->extended_value = class_slot[opline->op2.constant] | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); } else { - opline->extended_value = cache_size | (opline->extended_value & ZEND_ISEMPTY); + opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + class_slot[opline->op2.constant] = cache_size; cache_size += sizeof(void *); - class_slot[opline->op2.constant] = opline->extended_value & ~ZEND_ISEMPTY; } } break; diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 877e50ff510f..d840f4c530c6 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -336,10 +336,10 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, case ZEND_UNSET_STATIC_PROP: TO_STRING_NOWARN(val); opline->op1.constant = zend_optimizer_add_literal(op_array, val); - if (opline->op2_type == IS_CONST && opline->extended_value + sizeof(void*) == op_array->cache_size) { + if (opline->op2_type == IS_CONST && (opline->extended_value & ~ZEND_FETCH_REF) + sizeof(void*) == op_array->cache_size) { op_array->cache_size += sizeof(void *); } else { - opline->extended_value = alloc_cache_slots(op_array, 2); + opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & ZEND_FETCH_REF); } break; case ZEND_ISSET_ISEMPTY_STATIC_PROP: @@ -348,7 +348,7 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, if (opline->op2_type == IS_CONST && (opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*) == op_array->cache_size) { op_array->cache_size += sizeof(void *); } else { - opline->extended_value = alloc_cache_slots(op_array, 2) | (opline->extended_value & ZEND_ISEMPTY); + opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & ZEND_ISEMPTY); } break; case ZEND_SEND_VAR: @@ -423,6 +423,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, opline->result.num = alloc_cache_slots(op_array, 1); break; case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_STATIC_PROP_REF: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: @@ -435,7 +436,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, opline->op2.constant = zend_optimizer_add_literal(op_array, val); zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); if (opline->op1_type != IS_CONST) { - opline->extended_value = alloc_cache_slots(op_array, 1); + opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & (ZEND_RETURNS_FUNCTION | ZEND_FETCH_REF)); } break; case ZEND_ISSET_ISEMPTY_STATIC_PROP: From bb0e169c085d4bbac3483fc38d00e510a11e0d17 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 15 Jun 2018 00:24:09 +0200 Subject: [PATCH 246/369] Fix remaining tests --- Zend/zend_execute.c | 3 ++- ext/reflection/php_reflection.c | 2 +- ext/reflection/tests/ReflectionType_001.phpt | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index e4117c7ffdea..7b28eddef516 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2536,9 +2536,10 @@ static zend_never_inline int zend_fetch_static_property_address_ex(zval **retval return FAILURE; } + *prop_info = property_info; + if (EXPECTED(op1_type == IS_CONST)) { CACHE_POLYMORPHIC_PTR(cache_slot, ce, *retval); - *prop_info = property_info; CACHE_PTR(cache_slot + sizeof(void *) * 2, property_info); } diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 753654938fe8..92ce1054e0b8 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3980,7 +3980,7 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) } ZVAL_DEREF(variable_ptr); - if (zend_verify_property_type(prop_info, value, value, EX_USES_STRICT_TYPES())) { + if (!prop_info->type || zend_verify_property_type(prop_info, value, value, EX_USES_STRICT_TYPES())) { zval_ptr_dtor(variable_ptr); ZVAL_COPY(variable_ptr, value); } else { diff --git a/ext/reflection/tests/ReflectionType_001.phpt b/ext/reflection/tests/ReflectionType_001.phpt index 342306b48b24..bdffb19a9294 100644 --- a/ext/reflection/tests/ReflectionType_001.phpt +++ b/ext/reflection/tests/ReflectionType_001.phpt @@ -80,7 +80,7 @@ class PropTypeTest { public int $int; public string $string; public array $arr; - public callable $callable; + public iterable $iterable; public stdClass $std; public OtherThing $other; public $mixed; @@ -212,7 +212,7 @@ string(4) "Test" public int $int; public string $string; public array $arr; -public callable $callable; +public iterable $iterable; public stdClass $std; public OtherThing $other; public $mixed; From ddfa19d1e5d9dcf80853166b3f328e578420c687 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 15 Jun 2018 12:25:00 +0200 Subject: [PATCH 247/369] Fixing conversion with __get() on uninit typed properties Thanks @nikic for the first test --- .../typed_properties_072.phpt | 25 +++++++ .../typed_properties_073.phpt | 41 +++++++++++ .../typed_properties_074.phpt | 42 +++++++++++ Zend/zend_execute.c | 5 +- Zend/zend_execute.h | 2 + Zend/zend_object_handlers.c | 21 ++++-- Zend/zend_vm_def.h | 4 +- Zend/zend_vm_execute.h | 72 +++++++++---------- 8 files changed, 169 insertions(+), 43 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_072.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_073.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_074.phpt 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 000000000000..9123bb984440 --- /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-- +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 000000000000..54576ae2cabb --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_073.phpt @@ -0,0 +1,41 @@ +--TEST-- +Typed property must cast when used with &__get() +--FILE-- +prop; + } +} + +$test = new Test; +var_dump($test); +var_dump($intval = &$test->val); +var_dump($test); + +try { + $test->prop = "x"; +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump($intval); + +?> +--EXPECT-- +object(Test)#1 (1) { + ["prop"]=> + string(2) "42" + ["val"]=> + uninitialized(int) +} +int(42) +object(Test)#1 (1) { + ["prop"]=> + &int(42) + ["val"]=> + uninitialized(int) +} +Cannot assign string to reference of type int +int(42) 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 000000000000..baa6d9f02678 --- /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-- +prop; + } +} + +$test = new Test; +$dummyRef = &$test->prop; +var_dump($test); +try { + var_dump($test->val); +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump($test); + +$test->prop = "y"; +var_dump($test->prop); + +?> +--EXPECT-- +object(Test)#1 (1) { + ["prop"]=> + &string(1) "x" + ["val"]=> + uninitialized(int) +} +Typed property Test::$val must be int, string used +object(Test)#1 (1) { + ["prop"]=> + &string(1) "x" + ["val"]=> + uninitialized(int) +} +string(1) "y" + diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 7b28eddef516..8bce7de56430 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2595,7 +2595,7 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error(zend_type type, zval *zv) { ); } -static zend_always_inline zend_type zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type) { +static zend_always_inline zend_type i_zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type) { if (!ZEND_TYPE_ALLOW_NULL(old_type)) { ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ } @@ -2622,6 +2622,9 @@ static zend_always_inline zend_type zend_check_typed_assign_typed_ref(const char return 0; } +ZEND_API zend_type zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type) { + return i_zend_check_typed_assign_typed_ref(source, old_type, ref_type); +} static zend_never_inline void zend_fetch_this_var(int type OPLINE_DC EXECUTE_DATA_DC) { diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 42a7605c8d47..02aef9e1ad44 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -58,6 +58,8 @@ ZEND_API void ZEND_FASTCALL zend_check_internal_arg_type(zend_function *zf, uint ZEND_API int ZEND_FASTCALL zend_check_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot); ZEND_API ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(zend_execute_data *execute_data); +ZEND_API zend_type zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type); + ZEND_API zend_bool zend_load_property_class_type(zend_property_info *info); static zend_always_inline zend_type zend_get_prop_info_ref_type(zend_property_info *prop_info) { diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index c9f4af5246bc..c7ce553ace35 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -662,11 +662,24 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) && (prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot)))) { - zval tmp, *val; + zval *val = retval; + zend_type old_type; - val = zend_verify_property_type(prop_info, retval, &tmp, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES) != 0); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(member), retval); + if (Z_ISREF_P(val)) { + zend_type new_type = zend_get_prop_info_ref_type(prop_info); + old_type = Z_REFTYPE_P(val); + if (old_type != 0 && (new_type = zend_check_typed_assign_typed_ref("Property", old_type, new_type)) == 0) { + goto exit; + } + Z_REFTYPE_P(val) = new_type; + val = Z_REFVAL_P(val); + } + + if (UNEXPECTED(zend_verify_property_type(prop_info, val, val, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES)) == NULL)) { + zend_verify_property_type_error(prop_info, Z_STR_P(member), val); + if (Z_ISREF_P(retval)) { + Z_REFTYPE_P(retval) = old_type; + } } } goto exit; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 84de15cc203c..a4fa2b936bc9 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2773,7 +2773,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { FREE_OP1_VAR_PTR(); FREE_OP2(); FREE_OP_DATA_VAR_PTR(); @@ -2843,7 +2843,7 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { FREE_OP_DATA_VAR_PTR(); HANDLE_EXCEPTION(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index c066e0bd24f9..04e8bf02a0aa 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5260,7 +5260,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -5323,7 +5323,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -8663,7 +8663,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -8726,7 +8726,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -9554,7 +9554,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -9617,7 +9617,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -15025,7 +15025,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -15088,7 +15088,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -17366,7 +17366,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -17429,7 +17429,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -18001,7 +18001,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -18064,7 +18064,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -26278,7 +26278,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -26386,7 +26386,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29168,7 +29168,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { 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);}; @@ -29276,7 +29276,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); @@ -33681,7 +33681,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -33789,7 +33789,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -36003,7 +36003,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -36110,7 +36110,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { @@ -38195,7 +38195,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -38302,7 +38302,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { zval_ptr_dtor_nogc(free_op2); @@ -41012,7 +41012,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -41119,7 +41119,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { @@ -46833,7 +46833,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -46940,7 +46940,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { @@ -47009,7 +47009,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -47072,7 +47072,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -51245,7 +51245,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -51352,7 +51352,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { zval_ptr_dtor_nogc(free_op2); @@ -52663,7 +52663,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -52726,7 +52726,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -54192,7 +54192,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -54255,7 +54255,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -57987,7 +57987,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -58094,7 +58094,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { From 8e23778aa857b92abd4a22953f0e4c71d6b61645 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 15 Jun 2018 12:34:23 +0200 Subject: [PATCH 248/369] Prevent constant propagation into ASSIGN_*_REF OP_DATA --- ext/opcache/Optimizer/zend_optimizer.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index d840f4c530c6..5139bc5627c9 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -255,6 +255,14 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, zval *val) { switch (opline->opcode) { + case ZEND_OP_DATA: + switch ((opline-1)->opcode) { + case ZEND_ASSIGN_OBJ_REF: + case ZEND_ASSIGN_STATIC_PROP_REF: + return 0; + } + opline->op1.constant = zend_optimizer_add_literal(op_array, val); + break; case ZEND_FREE: case ZEND_CHECK_VAR: MAKE_NOP(opline); From fffb439ffc4399332956f561dd68797b2cda1212 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 15 Jun 2018 14:29:21 +0200 Subject: [PATCH 249/369] Add ZEND_PRE/POST_INC/DEC_STATIC_PROP --- .../typed_properties_075.phpt | 52 + Zend/zend_compile.c | 7 + Zend/zend_execute.c | 129 + Zend/zend_vm_def.h | 204 +- Zend/zend_vm_execute.h | 2258 +++++++---------- Zend/zend_vm_handlers.h | 1028 ++++---- Zend/zend_vm_opcodes.c | 12 +- Zend/zend_vm_opcodes.h | 6 +- ext/opcache/Optimizer/compact_literals.c | 8 + ext/opcache/Optimizer/zend_optimizer.c | 31 +- 10 files changed, 1795 insertions(+), 1940 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_075.phpt 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 000000000000..7ade931f3307 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_075.phpt @@ -0,0 +1,52 @@ +--TEST-- +Test typed properties overflowing +--FILE-- +getMessage()); +} + +var_dump(Foo::$bar); + +try { + Foo::$bar += 1; +} catch(TypeError $t) { + var_dump($t->getMessage()); +} + +var_dump(Foo::$bar); + +try { + ++Foo::$bar; +} catch(TypeError $t) { + var_dump($t->getMessage()); +} + +var_dump(Foo::$bar); + +try { + Foo::$bar = Foo::$bar + 1; +} catch(TypeError $t) { + var_dump($t->getMessage()); +} + +var_dump(Foo::$bar); + +?> +--EXPECTF-- +string(48) "Typed property Foo::$bar must be int, float used" +int(9223372036854775807) +string(48) "Typed property Foo::$bar must be int, float used" +int(9223372036854775807) +string(48) "Typed property Foo::$bar must be int, float used" +int(9223372036854775807) +string(48) "Typed property Foo::$bar must be int, float used" +int(9223372036854775807) + diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index b9dd71185a8e..27359fc64dac 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7349,6 +7349,10 @@ void zend_compile_post_incdec(znode *result, zend_ast *ast) /* {{{ */ 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, 0); @@ -7368,6 +7372,9 @@ void zend_compile_pre_incdec(znode *result, zend_ast *ast) /* {{{ */ if (var_ast->kind == ZEND_AST_PROP) { 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, 0); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 8bce7de56430..4fc382ffeb6e 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1607,6 +1607,135 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, } } +static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_info, int inc OPLINE_DC EXECUTE_DATA_DC) +{ + if (EXPECTED(Z_TYPE_P(prop) == IS_LONG)) { + if (inc) { + fast_long_increment_function(prop); + } else { + fast_long_decrement_function(prop); + } + if (UNEXPECTED(Z_TYPE_P(prop) != IS_LONG) && UNEXPECTED(prop_info)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, prop, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, prop); + if (inc) { + ZVAL_LONG(prop, ZEND_LONG_MAX); + } else { + ZVAL_LONG(prop, ZEND_LONG_MIN); + } + } + } + } else { + zend_type ref_type = 0; + if (Z_ISREF_P(prop)) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + + if (UNEXPECTED(ref_type || prop_info)) { + /* special case for typed properties */ + zval z_copy; + + ZVAL_COPY(&z_copy, prop); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + SEPARATE_ZVAL_NOREF(prop); + if (inc) { + increment_function(prop); + } else { + decrement_function(prop); + } + } + } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } +} + +static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_info, int inc OPLINE_DC EXECUTE_DATA_DC) +{ + if (EXPECTED(Z_TYPE_P(prop) == IS_LONG)) { + ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(prop)); + if (inc) { + fast_long_increment_function(prop); + } else { + fast_long_decrement_function(prop); + } + if (UNEXPECTED(Z_TYPE_P(prop) != IS_LONG)) { + if (UNEXPECTED(prop_info)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, prop, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, prop); + if (inc) { + ZVAL_LONG(prop, ZEND_LONG_MAX); + } else { + ZVAL_LONG(prop, ZEND_LONG_MIN); + } + } + } + } + } else { + zend_type ref_type = 0; + if (Z_ISREF_P(prop)) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), prop); + + if (UNEXPECTED(ref_type || prop_info)) { + /* special case for typed properties */ + zval z_copy; + + ZVAL_DUP(&z_copy, prop); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(prop); /* we copied by value into result.var */ + } + } else { + zval_opt_copy_ctor(prop); + if (inc) { + increment_function(prop); + } else { + decrement_function(prop); + } + } + } +} + static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, zval *property, void **cache_slot, int inc OPLINE_DC EXECUTE_DATA_DC) { if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index a4fa2b936bc9..9c11bf1818d2 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1241,77 +1241,12 @@ ZEND_VM_C_LABEL(pre_incdec_object): 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (OP2_TYPE == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if (OP2_TYPE == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -1373,78 +1308,13 @@ ZEND_VM_C_LABEL(post_incdec_object): 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (OP2_TYPE == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if (OP2_TYPE == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -1466,6 +1336,62 @@ ZEND_VM_HANDLER(135, ZEND_POST_DEC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CAC ZEND_VM_DISPATCH_TO_HELPER(zend_post_incdec_property_helper, inc, 0); } +ZEND_VM_HELPER(zend_pre_incdec_static_property_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, int inc) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +ZEND_VM_HANDLER(202, ZEND_PRE_INC_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT) +{ + ZEND_VM_DISPATCH_TO_HELPER(zend_pre_incdec_static_property_helper, inc, 1); +} + +ZEND_VM_HANDLER(203, ZEND_PRE_DEC_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT) +{ + ZEND_VM_DISPATCH_TO_HELPER(zend_pre_incdec_static_property_helper, inc, 0); +} + +ZEND_VM_HELPER(zend_post_incdec_static_property_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, int inc) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +ZEND_VM_HANDLER(204, ZEND_POST_INC_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT) +{ + ZEND_VM_DISPATCH_TO_HELPER(zend_post_incdec_static_property_helper, inc, 1); +} + +ZEND_VM_HANDLER(205, ZEND_POST_DEC_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT) +{ + ZEND_VM_DISPATCH_TO_HELPER(zend_post_incdec_static_property_helper, inc, 0); +} + ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) { USE_OPLINE diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 04e8bf02a0aa..758e22fab821 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4673,6 +4673,62 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CONST_CONST_ST ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_CONST_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CONST_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CONST_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -8361,6 +8417,62 @@ 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_pre_incdec_static_property_helper_SPEC_CONST_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CONST_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CONST_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -9118,6 +9230,62 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CONST_UNUSED_S ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_CONST_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CONST_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -14479,6 +14647,62 @@ 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_pre_incdec_static_property_helper_SPEC_TMPVAR_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_TMPVAR_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -17064,6 +17288,62 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_TMPVAR_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_TMPVAR_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -17580,6 +17860,62 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_VAR_HAN ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -24841,77 +25177,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -24972,78 +25243,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -27784,77 +27990,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -27916,78 +28057,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -32196,77 +32272,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -32327,78 +32338,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -34865,77 +34811,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -34996,78 +34877,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -37053,77 +36869,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -37185,78 +36936,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -39874,77 +39560,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -40005,78 +39626,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -44886,77 +44442,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -45017,78 +44508,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -45109,6 +44535,62 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_CONST_HAN ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_CV_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_CV_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CV_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CV_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -49615,77 +49097,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -49747,78 +49164,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -52256,6 +51608,62 @@ 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_pre_incdec_static_property_helper_SPEC_CV_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CV_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CV_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -53372,6 +52780,62 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_UNUSED_STAT ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_CV_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CV_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -56258,77 +55722,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -56389,78 +55788,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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 (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - 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_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -62625,6 +61959,106 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_JMP_FORWARD_SPEC_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -64163,6 +63597,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_POW_SPEC_CONST_CONST_STATIC_PROP) ZEND_ASSIGN_POW_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST) + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST) + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST) + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_CONST): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_CONST) ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -64523,6 +63973,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_YIELD_SPEC_CONST_TMP) ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR) + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR) + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR) + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_VAR): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_VAR) ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -64631,6 +64097,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_POW_SPEC_CONST_UNUSED_STATIC_PROP) ZEND_ASSIGN_POW_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED) + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED) + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED) + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_R_SPEC_CONST_UNUSED): VM_TRACE(ZEND_FETCH_R_SPEC_CONST_UNUSED) ZEND_FETCH_R_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -65379,6 +64861,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_BOOL_XOR_SPEC_TMPVAR_CONST) ZEND_BOOL_XOR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST) + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST) + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST) ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -65591,6 +65089,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) 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_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR) + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR) + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR) ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -65651,6 +65165,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) ZEND_INSTANCEOF_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_R_SPEC_TMPVAR_UNUSED): VM_TRACE(ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) ZEND_FETCH_R_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -68541,6 +68071,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_POST_DEC_OBJ_SPEC_CV_CONST) ZEND_POST_DEC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST) + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST) + ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST) + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_CV_CONST): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_CV_CONST) ZEND_FETCH_STATIC_PROP_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -69189,6 +68735,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR) ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR) + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR) + ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR) + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_CV_VAR): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_CV_VAR) ZEND_FETCH_STATIC_PROP_R_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -69361,6 +68923,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_POW_SPEC_CV_UNUSED_STATIC_PROP) ZEND_ASSIGN_POW_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED) + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED) + ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED) + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_R_SPEC_CV_UNUSED): VM_TRACE(ZEND_FETCH_R_SPEC_CV_UNUSED) ZEND_FETCH_R_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -73689,6 +73267,106 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER, + ZEND_NULL_HANDLER, ZEND_JMP_FORWARD_SPEC_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -74785,7 +74463,11 @@ void zend_vm_init(void) 3347 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, 3472 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, 3597 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 4613 + 3722 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3747 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3772 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3797 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 4713 }; #if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) zend_opcode_handler_funcs = labels; @@ -74988,7 +74670,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 = 3723 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3823 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -74996,7 +74678,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 = 3748 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3848 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -75004,7 +74686,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 = 3773 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3873 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -75015,17 +74697,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 = 3798 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3898 | 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 = 3823 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3923 | 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 = 3848 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3948 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_MUL: @@ -75036,17 +74718,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 = 3873 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3973 | 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 = 3898 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3998 | 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 = 3923 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 4023 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_EQUAL: @@ -75057,12 +74739,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 = 3948 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4048 | 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 = 4023 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4123 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_NOT_EQUAL: @@ -75073,12 +74755,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 = 4098 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4198 | 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 = 4173 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4273 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_SMALLER: @@ -75086,12 +74768,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 = 4248 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4348 | 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 = 4323 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4423 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_IS_SMALLER_OR_EQUAL: @@ -75099,70 +74781,70 @@ 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 = 4398 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4498 | 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 = 4473 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4573 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_QM_ASSIGN: if (op1_info == MAY_BE_DOUBLE) { - spec = 4566 | SPEC_RULE_OP1; + spec = 4666 | SPEC_RULE_OP1; } else if (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)))) { - spec = 4571 | SPEC_RULE_OP1; + spec = 4671 | SPEC_RULE_OP1; } break; case ZEND_PRE_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4548 | SPEC_RULE_RETVAL; + spec = 4648 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 4550 | SPEC_RULE_RETVAL; + spec = 4650 | SPEC_RULE_RETVAL; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4552 | SPEC_RULE_RETVAL; + spec = 4652 | SPEC_RULE_RETVAL; } break; case ZEND_PRE_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4554 | SPEC_RULE_RETVAL; + spec = 4654 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 4556 | SPEC_RULE_RETVAL; + spec = 4656 | SPEC_RULE_RETVAL; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4558 | SPEC_RULE_RETVAL; + spec = 4658 | SPEC_RULE_RETVAL; } break; case ZEND_POST_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4560; + spec = 4660; } else if (op1_info == MAY_BE_LONG) { - spec = 4561; + spec = 4661; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4562; + spec = 4662; } break; case ZEND_POST_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4563; + spec = 4663; } else if (op1_info == MAY_BE_LONG) { - spec = 4564; + spec = 4664; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4565; + spec = 4665; } break; case ZEND_JMP: if (OP_JMP_ADDR(op, op->op1) > op) { - spec = 3722; + spec = 3822; } break; case ZEND_SEND_VAR_EX: if (op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4606 | SPEC_RULE_OP1; + spec = 4706 | 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 = 4611 | SPEC_RULE_RETVAL; + spec = 4711 | SPEC_RULE_RETVAL; } break; case ZEND_FETCH_DIM_R: @@ -75170,12 +74852,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 = 4576 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4676 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_SEND_VAR: if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4601 | SPEC_RULE_OP1; + spec = 4701 | SPEC_RULE_OP1; } break; case ZEND_BW_OR: diff --git a/Zend/zend_vm_handlers.h b/Zend/zend_vm_handlers.h index b00a106ffe4a..722171847006 100644 --- a/Zend/zend_vm_handlers.h +++ b/Zend/zend_vm_handlers.h @@ -1857,493 +1857,541 @@ _(3711, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV) \ _(3714, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR) \ _(3716, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV) \ - _(3722, ZEND_JMP_FORWARD_SPEC) \ - _(3728, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3729, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3730, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3732, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3733, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3734, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3735, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3737, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3743, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3744, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3745, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3747, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3753, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3754, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3755, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3757, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3758, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3759, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3760, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3762, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3768, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3769, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3770, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3772, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3778, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3779, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3780, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3782, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3783, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3784, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3785, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3787, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3793, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3794, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3795, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3797, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3799, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3800, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3802, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3803, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3804, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3805, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3807, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3808, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3809, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3810, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3812, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3818, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3819, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3820, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3822, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3824, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3825, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3827, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3828, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3829, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3830, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3832, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3833, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3834, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3835, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3837, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3843, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3844, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3845, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3847, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3849, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3850, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3852, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3853, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3854, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3855, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3857, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3858, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3859, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3860, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3862, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3868, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3869, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3870, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3872, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3878, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3879, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3880, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3882, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3883, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3884, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3885, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3887, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3893, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3894, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3895, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3897, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3903, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(3904, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3905, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3907, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3908, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(3909, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3910, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3912, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3918, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(3919, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3920, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3922, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3928, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3929, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3930, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3932, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3933, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3934, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3935, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3937, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3943, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3944, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3945, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3947, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3963, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3964, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3965, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3966, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3967, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3968, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3969, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3970, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3971, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3975, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3976, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3977, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3978, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3979, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3980, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3981, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3982, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3983, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3984, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3985, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3986, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3990, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3991, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3992, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4008, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4009, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4010, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4011, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4012, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4013, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4014, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4015, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4016, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4020, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4021, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4022, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4038, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4039, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4040, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4041, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4042, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4043, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4044, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4045, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4046, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4050, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4051, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4052, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4053, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4054, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4055, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4056, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4057, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4058, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4059, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4060, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4061, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4065, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4066, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4067, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4083, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4084, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4085, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4086, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4087, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4088, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4089, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4090, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4091, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4095, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4096, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4097, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4113, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4114, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4115, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4116, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4117, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4118, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4119, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4120, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4121, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4125, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4126, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4127, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4128, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4129, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4130, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4131, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4132, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4133, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4134, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4135, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4136, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4140, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4141, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4142, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4158, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4159, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4160, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4161, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4162, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4163, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4164, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4165, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4166, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4170, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4171, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4172, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4188, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4189, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4190, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4191, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4192, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4193, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4194, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4195, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4196, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4200, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4201, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4202, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4203, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4204, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4205, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4206, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4207, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4208, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4209, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4210, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4211, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4215, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4216, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4217, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4233, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4234, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4235, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4236, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4237, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4238, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4239, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4240, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4241, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4245, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4246, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4247, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4251, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4252, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4253, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4254, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4255, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4256, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4260, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4261, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4262, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4263, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4264, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4265, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4266, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4267, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4268, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4269, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4270, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4271, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4275, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4276, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4277, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4278, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4279, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4280, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4281, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4282, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4283, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4284, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4285, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4286, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4290, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4291, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4292, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4308, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4309, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4310, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4311, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4312, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4313, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4314, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4315, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4316, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4320, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4321, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4322, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4326, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4327, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4328, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4329, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4330, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4331, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4335, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4336, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4337, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4338, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4339, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4340, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4341, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4342, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4343, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4344, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4345, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4346, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4350, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4351, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4352, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4353, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4354, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4355, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4356, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4357, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4358, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4359, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4360, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4361, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4365, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4366, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4367, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4383, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4384, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4385, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4386, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4387, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4388, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4389, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4390, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4391, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4395, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4396, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4397, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4401, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4402, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4403, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4404, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4405, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4406, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4410, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4411, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4412, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4413, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4414, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4415, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4416, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4417, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4418, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4419, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4420, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4421, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4425, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4426, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4427, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4428, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4429, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4430, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4431, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4432, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4433, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4434, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4435, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4436, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4440, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4441, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4442, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4458, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4459, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4460, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4461, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4462, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4463, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4464, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4465, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4466, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4470, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4471, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4472, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4476, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4477, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4478, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4479, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4480, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4481, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4485, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4486, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4487, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4488, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4489, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4490, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4491, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4492, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4493, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4494, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4495, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4496, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4500, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4501, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4502, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4503, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4504, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4505, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4506, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4507, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4508, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4509, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4510, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4511, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4515, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4516, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4517, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4533, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4534, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4535, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4536, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4537, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4538, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4539, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4540, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4541, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4545, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4546, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4547, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4548, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4549, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ - _(4550, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4551, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ - _(4552, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4553, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ - _(4554, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4555, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ - _(4556, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4557, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ - _(4558, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4559, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ - _(4560, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ - _(4561, ZEND_POST_INC_LONG_SPEC_TMPVARCV) \ - _(4562, ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ - _(4563, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ - _(4564, ZEND_POST_DEC_LONG_SPEC_TMPVARCV) \ - _(4565, ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ - _(4566, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ - _(4567, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4568, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4570, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4571, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ - _(4572, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4573, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4575, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4577, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4578, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4580, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4581, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(4582, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4583, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4585, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4586, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(4587, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4588, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4590, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4596, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ - _(4597, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4598, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4600, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4603, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ - _(4605, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ - _(4608, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR) \ - _(4610, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV) \ - _(4611, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ - _(4612, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ - _(4612+1, ZEND_NULL) + _(3722, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3724, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3725, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3727, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3729, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3730, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3732, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3734, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3735, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3742, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST) \ + _(3744, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR) \ + _(3745, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3747, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3749, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3750, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3752, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3754, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3755, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3757, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3759, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3760, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3767, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST) \ + _(3769, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR) \ + _(3770, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3772, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3774, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3775, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3777, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3779, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3780, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3782, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3784, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3785, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3792, ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST) \ + _(3794, ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR) \ + _(3795, ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3797, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3799, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3800, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3802, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3804, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3805, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3807, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3809, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3810, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3817, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST) \ + _(3819, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR) \ + _(3820, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3822, ZEND_JMP_FORWARD_SPEC) \ + _(3828, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3829, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3830, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3832, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3833, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3834, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3835, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3837, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3843, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3844, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3845, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3847, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3853, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3854, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3855, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3857, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3858, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3859, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3860, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3862, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3868, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3869, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3870, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3872, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3878, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3879, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3880, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3882, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3883, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3884, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3885, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3887, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3893, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3894, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3895, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3897, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3899, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3900, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3902, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3903, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3904, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3905, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3907, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3908, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3909, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3910, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3912, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3918, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3919, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3920, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3922, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3924, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3925, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3927, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3928, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3929, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3930, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3932, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3933, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3934, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3935, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3937, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3943, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3944, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3945, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3947, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3949, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3950, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3952, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3953, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3954, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3955, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3957, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3958, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3959, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3960, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3962, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3968, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3969, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3970, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3972, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3978, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3979, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3980, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3982, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3983, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3984, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3985, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3987, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3993, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3994, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3995, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3997, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(4003, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(4004, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4005, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4007, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4008, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(4009, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4010, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4012, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4018, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(4019, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4020, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4022, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4028, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4029, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4030, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4032, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4033, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4034, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4035, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4037, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4043, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4044, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4045, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4047, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4063, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4064, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4065, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4066, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4067, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4068, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4069, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4070, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4071, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4075, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4076, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4077, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4078, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4079, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4080, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4081, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4082, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4083, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4084, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4085, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4086, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4090, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4091, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4092, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4108, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4109, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4110, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4111, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4112, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4113, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4114, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4115, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4116, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4120, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4121, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4122, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4138, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4139, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4140, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4141, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4142, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4143, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4144, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4145, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4146, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4150, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4151, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4152, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4153, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4154, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4155, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4156, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4157, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4158, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4159, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4160, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4161, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4165, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4166, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4167, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4183, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4184, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4185, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4186, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4187, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4188, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4189, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4190, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4191, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4195, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4196, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4197, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4213, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4214, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4215, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4216, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4217, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4218, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4219, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4220, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4221, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4225, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4226, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4227, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4228, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4229, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4230, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4231, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4232, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4233, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4234, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4235, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4236, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4240, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4241, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4242, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4258, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4259, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4260, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4261, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4262, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4263, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4264, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4265, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4266, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4270, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4271, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4272, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4288, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4289, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4290, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4291, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4292, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4293, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4294, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4295, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4296, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4300, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4301, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4302, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4303, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4304, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4305, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4306, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4307, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4308, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4309, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4310, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4311, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4315, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4316, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4317, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4333, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4334, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4335, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4336, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4337, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4338, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4339, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4340, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4341, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4345, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4346, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4347, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4351, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4352, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4353, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4354, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4355, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4356, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4360, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4361, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4362, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4363, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4364, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4365, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4366, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4367, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4368, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4369, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4370, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4371, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4375, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4376, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4377, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4378, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4379, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4380, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4381, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4382, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4383, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4384, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4385, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4386, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4390, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4391, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4392, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4408, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4409, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4410, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4411, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4412, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4413, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4414, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4415, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4416, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4420, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4421, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4422, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4426, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4427, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4428, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4429, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4430, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4431, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4435, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4436, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4437, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4438, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4439, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4440, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4441, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4442, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4443, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4444, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4445, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4446, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4450, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4451, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4452, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4453, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4454, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4455, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4456, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4457, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4458, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4459, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4460, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4461, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4465, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4466, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4467, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4483, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4484, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4485, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4486, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4487, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4488, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4489, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4490, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4491, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4495, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4496, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4497, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4501, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4502, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4503, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4504, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4505, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4506, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4510, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4511, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4512, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4513, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4514, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4515, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4516, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4517, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4518, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4519, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4520, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4521, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4525, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4526, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4527, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4528, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4529, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4530, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4531, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4532, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4533, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4534, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4535, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4536, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4540, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4541, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4542, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4558, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4559, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4560, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4561, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4562, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4563, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4564, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4565, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4566, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4570, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4571, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4572, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4576, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4577, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4578, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4579, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4580, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4581, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4585, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4586, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4587, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4588, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4589, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4590, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4591, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4592, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4593, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4594, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4595, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4596, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4600, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4601, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4602, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4603, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4604, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4605, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4606, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4607, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4608, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4609, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4610, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4611, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4615, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4616, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4617, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4633, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4634, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4635, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4636, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4637, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4638, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4639, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4640, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4641, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4645, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4646, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4647, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4648, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4649, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ + _(4650, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4651, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ + _(4652, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4653, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ + _(4654, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4655, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ + _(4656, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4657, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ + _(4658, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4659, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ + _(4660, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ + _(4661, ZEND_POST_INC_LONG_SPEC_TMPVARCV) \ + _(4662, ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ + _(4663, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ + _(4664, ZEND_POST_DEC_LONG_SPEC_TMPVARCV) \ + _(4665, ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ + _(4666, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ + _(4667, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4668, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4670, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4671, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ + _(4672, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4673, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4675, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4677, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4678, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4680, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4681, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(4682, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4683, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4685, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4686, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(4687, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4688, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4690, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4696, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ + _(4697, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4698, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4700, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4703, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ + _(4705, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ + _(4708, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR) \ + _(4710, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV) \ + _(4711, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ + _(4712, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ + _(4712+1, ZEND_NULL) diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index fa478c5343db..19c8b2e9d70b 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -22,7 +22,7 @@ #include #include -static const char *zend_vm_opcodes_names[202] = { +static const char *zend_vm_opcodes_names[206] = { "ZEND_NOP", "ZEND_ADD", "ZEND_SUB", @@ -225,9 +225,13 @@ static const char *zend_vm_opcodes_names[202] = { "ZEND_ASSIGN_OBJ_REF", "ZEND_ASSIGN_STATIC_PROP", "ZEND_ASSIGN_STATIC_PROP_REF", + "ZEND_PRE_INC_STATIC_PROP", + "ZEND_PRE_DEC_STATIC_PROP", + "ZEND_POST_INC_STATIC_PROP", + "ZEND_POST_DEC_STATIC_PROP", }; -static uint32_t zend_vm_opcodes_flags[202] = { +static uint32_t zend_vm_opcodes_flags[206] = { 0x00000000, 0x00000707, 0x00000707, @@ -430,6 +434,10 @@ static uint32_t zend_vm_opcodes_flags[202] = { 0x0b040751, 0x00040307, 0x0b040307, + 0x00040307, + 0x00040307, + 0x00040307, + 0x00040307, }; ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode) { diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index 6429d32f3ed9..de2607e4cc2c 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -277,7 +277,11 @@ END_EXTERN_C() #define ZEND_ASSIGN_OBJ_REF 199 #define ZEND_ASSIGN_STATIC_PROP 200 #define ZEND_ASSIGN_STATIC_PROP_REF 201 +#define ZEND_PRE_INC_STATIC_PROP 202 +#define ZEND_PRE_DEC_STATIC_PROP 203 +#define ZEND_POST_INC_STATIC_PROP 204 +#define ZEND_POST_DEC_STATIC_PROP 205 -#define ZEND_VM_LAST_OPCODE 201 +#define ZEND_VM_LAST_OPCODE 205 #endif diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index 5717fa22cc5d..a16cd873925a 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -192,6 +192,10 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: case ZEND_ISSET_ISEMPTY_STATIC_PROP: + case ZEND_PRE_INC_STATIC_PROP: + case ZEND_PRE_DEC_STATIC_PROP: + case ZEND_POST_INC_STATIC_PROP: + case ZEND_POST_DEC_STATIC_PROP: literals_handle_static_prop: if (opline->op2_type == IS_CONST) { LITERAL_INFO(opline->op2.constant, LITERAL_CLASS, 2); @@ -671,6 +675,10 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: case ZEND_ISSET_ISEMPTY_STATIC_PROP: + case ZEND_PRE_INC_STATIC_PROP: + case ZEND_PRE_DEC_STATIC_PROP: + case ZEND_POST_INC_STATIC_PROP: + case ZEND_POST_DEC_STATIC_PROP: if (opline->op1_type == IS_CONST) { // op1 static property if (opline->op2_type == IS_CONST) { diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 5139bc5627c9..880bbc0ae0b7 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -342,21 +342,17 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, case ZEND_FETCH_STATIC_PROP_UNSET: case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: - TO_STRING_NOWARN(val); - opline->op1.constant = zend_optimizer_add_literal(op_array, val); - if (opline->op2_type == IS_CONST && (opline->extended_value & ~ZEND_FETCH_REF) + sizeof(void*) == op_array->cache_size) { - op_array->cache_size += sizeof(void *); - } else { - opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & ZEND_FETCH_REF); - } - break; case ZEND_ISSET_ISEMPTY_STATIC_PROP: + case ZEND_PRE_INC_STATIC_PROP: + case ZEND_PRE_DEC_STATIC_PROP: + case ZEND_POST_INC_STATIC_PROP: + case ZEND_POST_DEC_STATIC_PROP: TO_STRING_NOWARN(val); opline->op1.constant = zend_optimizer_add_literal(op_array, val); - if (opline->op2_type == IS_CONST && (opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*) == op_array->cache_size) { + if (opline->op2_type == IS_CONST && (opline->extended_value & ~(ZEND_FETCH_REF|ZEND_ISEMPTY)) + sizeof(void*) == op_array->cache_size) { op_array->cache_size += sizeof(void *); } else { - opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & ZEND_ISEMPTY); + opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); } break; case ZEND_SEND_VAR: @@ -439,22 +435,17 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, case ZEND_FETCH_STATIC_PROP_UNSET: case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: - REQUIRES_STRING(val); - drop_leading_backslash(val); - opline->op2.constant = zend_optimizer_add_literal(op_array, val); - zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); - if (opline->op1_type != IS_CONST) { - opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & (ZEND_RETURNS_FUNCTION | ZEND_FETCH_REF)); - } - break; - case ZEND_ISSET_ISEMPTY_STATIC_PROP: + case ZEND_PRE_INC_STATIC_PROP: + case ZEND_PRE_DEC_STATIC_PROP: + case ZEND_POST_INC_STATIC_PROP: + case ZEND_POST_DEC_STATIC_PROP: handle_static_prop: REQUIRES_STRING(val); drop_leading_backslash(val); opline->op2.constant = zend_optimizer_add_literal(op_array, val); zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); if (opline->op1_type != IS_CONST) { - opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & ZEND_ISEMPTY); + opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & (ZEND_RETURNS_FUNCTION | ZEND_FETCH_REF | ZEND_ISEMPTY)); } break; case ZEND_INIT_FCALL: From 17bdcef09649c35d78d6135ce77897a070403999 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 15 Jun 2018 16:31:13 +0200 Subject: [PATCH 250/369] Property compute intersection types for $obj->prop =& $ref Test currently fails due to unrelated leaks. --- Zend/zend_execute.c | 92 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 82 insertions(+), 10 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 4fc382ffeb6e..002880ab4789 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2724,21 +2724,93 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error(zend_type type, zval *zv) { ); } -static zend_always_inline zend_type i_zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ +static zend_always_inline void swap_types(zend_type *type1, zend_type *type2) { + zend_type tmp = *type1; + *type1 = *type2; + *type2 = tmp; +} + +/* Returns intersection type, or type "void" if intersection impossible, or 0 if intersection + * currently not representable. */ +static zend_type compute_intersection_type(zend_type type1, zend_type type2) { + ZEND_ASSERT(ZEND_TYPE_IS_SET(type1) && ZEND_TYPE_IS_SET(type2)); + if (type1 == type2) { + return type1; } - if (ZEND_TYPE_WITHOUT_NULL(old_type) == ref_type) { - return ref_type; + + /* Intersection is nullable only if both are nullable. */ + if (ZEND_TYPE_ALLOW_NULL(type1) != ZEND_TYPE_ALLOW_NULL(type2)) { + type1 = ZEND_TYPE_WITHOUT_NULL(type1); + type2 = ZEND_TYPE_WITHOUT_NULL(type2); } - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - return ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - return ref_type; + + /* For class types, we can only handle cases where one type is a child of the other. + * Anything else would require full intersection types. */ + if (ZEND_TYPE_IS_CLASS(type1) && ZEND_TYPE_IS_CLASS(type2)) { + if (instanceof_function(ZEND_TYPE_CE(type1), ZEND_TYPE_CE(type2))) { + return type1; + } else if (instanceof_function(ZEND_TYPE_CE(type2), ZEND_TYPE_CE(type1))) { + return type2; } + return 0; + } + + if (ZEND_TYPE_IS_CODE(type1) && ZEND_TYPE_IS_CODE(type2)) { + if (ZEND_TYPE_CODE(type1) == ZEND_TYPE_CODE(type2)) { + return type1; + } + + /* Make sure the smaller code is on the left. */ + if (ZEND_TYPE_CODE(type1) > ZEND_TYPE_CODE(type2)) { + swap_types(&type1, &type2); + } + } + + /* Make sure class type (if any) is on the right. */ + if (ZEND_TYPE_IS_CLASS(type1)) { + swap_types(&type1, &type2); + } + + ZEND_ASSERT(ZEND_TYPE_IS_CODE(type1)); + switch (ZEND_TYPE_CODE(type1)) { + case _IS_BOOL: + case IS_LONG: + case IS_DOUBLE: + case IS_STRING: + break; + case IS_OBJECT: + if (ZEND_TYPE_IS_CLASS(type2)) { + return type2; + } + break; + case IS_ARRAY: + if (ZEND_TYPE_IS_CODE(type2) && ZEND_TYPE_CODE(type2) == IS_ITERABLE) { + return type1; + } + break; + case IS_ITERABLE: + if (ZEND_TYPE_IS_CLASS(type2) && + instanceof_function(ZEND_TYPE_CE(type2), zend_ce_traversable)) { + return type2; + } + break; + default: + ZEND_ASSERT(0); + break; + } + + /* Intersection is empty */ + return ZEND_TYPE_ENCODE(IS_VOID, 0); +} + +static zend_always_inline zend_type i_zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type) { + zend_type intersect_type = compute_intersection_type(old_type, ref_type); + if (EXPECTED(intersect_type != 0 && intersect_type != ZEND_TYPE_ENCODE(IS_VOID, 0))) { + return intersect_type; } + /* TODO(typed_refs) Throw different errors for "intersection illegal" and "can't represent + * intersection" cases? */ zend_throw_exception_ex( zend_ce_type_error, ZEND_TYPE_IS_CLASS(ref_type) ? IS_OBJECT : ZEND_TYPE_CODE(ref_type), "%s and reference types %s%s and %s%s are not compatible", From 40079bf7d045c7be2d67df754141f72e827d45f9 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 15 Jun 2018 16:49:52 +0200 Subject: [PATCH 251/369] Add missing test file... --- .../typed_properties_076.phpt | 70 +++++++++++++++++++ Zend/zend_execute.c | 13 ++-- 2 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_076.phpt 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 000000000000..93a8585cdd8b --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_076.phpt @@ -0,0 +1,70 @@ +--TEST-- +Computation of intersection types for typed reference to typed property assignments +--FILE-- +$prop2 = $value; + $test->$prop1 =& $test->$prop2; + echo "Invalid assignment $prop1 =& $prop2 did not error\n"; + } catch (TypeError $e) {} + try { + $test->$prop1 = $value; + $test->$prop2 =& $test->$prop1; + echo "Invalid assignment $prop2 =& $prop1 did not error\n"; + } catch (TypeError $e) {} +} + +function valid(Test $test, string $prop1, string $prop2, $value) { + try { + $test->$prop2 = $value; + $test->$prop1 =& $test->$prop2; + } catch (TypeError $e) { + echo "Valid assignment $prop1 =& $prop2 threw {$e->getMessage()}\n"; + } + try { + $test->$prop1 = $value; + $test->$prop2 =& $test->$prop1; + } catch (TypeError $e) { + echo "Valid assignment $prop2 =& $prop1 threw {$e->getMessage()}\n"; + } +} + +$test = new Test; +invalid($test, 'int', 'float', 42.0); +valid($test, 'int', 'nint', 42); +invalid($test, 'int', 'nint', null); +invalid($test, 'nint', 'nstring', null); +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/zend_execute.c b/Zend/zend_execute.c index 002880ab4789..54ceca4808ad 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2778,21 +2778,24 @@ static zend_type compute_intersection_type(zend_type type1, zend_type type2) { case IS_DOUBLE: case IS_STRING: break; - case IS_OBJECT: - if (ZEND_TYPE_IS_CLASS(type2)) { - return type2; - } - break; case IS_ARRAY: if (ZEND_TYPE_IS_CODE(type2) && ZEND_TYPE_CODE(type2) == IS_ITERABLE) { return type1; } break; + case IS_OBJECT: + if (ZEND_TYPE_IS_CLASS(type2)) { + return type2; + } + break; case IS_ITERABLE: if (ZEND_TYPE_IS_CLASS(type2) && instanceof_function(ZEND_TYPE_CE(type2), zend_ce_traversable)) { return type2; } + if (ZEND_TYPE_IS_CODE(type2) && ZEND_TYPE_CODE(type2) == IS_OBJECT) { + return ZEND_TYPE_ENCODE_CLASS(zend_ce_traversable, ZEND_TYPE_ALLOW_NULL(type1)); + } break; default: ZEND_ASSERT(0); From bc900ead6646ca8f1237c877575063c386f51806 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 15 Jun 2018 18:43:45 +0200 Subject: [PATCH 252/369] Fix leak --- Zend/zend_execute.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 02aef9e1ad44..48876a0a8cb9 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -108,6 +108,9 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval } if (!zend_verify_ref_type_assignable_zval(Z_REFTYPE_P(variable_ptr), value, strict)) { zend_throw_ref_type_error(Z_REFTYPE_P(variable_ptr), value); + if (need_copy) { + Z_TRY_DELREF_P(value); + } return Z_REFVAL_P(variable_ptr); } if (need_copy) { From a450c28534fc465bcc833ad3ecfc5fa6a735cf97 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 16 Jun 2018 18:40:50 +0200 Subject: [PATCH 253/369] $a->b = $c must return (string) $c if $a->b is of type string --- .../typed_properties_077.phpt | 18 +++ Zend/zend_object_handlers.c | 9 +- Zend/zend_object_handlers.h | 5 +- Zend/zend_vm_def.h | 4 +- Zend/zend_vm_execute.h | 144 +++++++++--------- ext/date/php_date.c | 21 ++- ext/dom/php_dom.c | 6 +- .../transliterator/transliterator_class.c | 7 +- ext/mysqli/mysqli.c | 6 +- ext/reflection/php_reflection.c | 5 +- ext/simplexml/simplexml.c | 27 ++-- ext/snmp/snmp.c | 6 +- ext/spl/spl_array.c | 6 +- ext/standard/incomplete_class.c | 3 +- ext/xmlreader/php_xmlreader.c | 6 +- 15 files changed, 158 insertions(+), 115 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_077.phpt 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 000000000000..4e2640338f46 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_077.phpt @@ -0,0 +1,18 @@ +--TEST-- +Converted values shall be returned and not the original value upon property assignment +--FILE-- +i = "42"); +var_dump($test->s = 42); + +?> +--EXPECT-- +int(42) +string(2) "42" diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index c7ce553ace35..da3fabb7b8a4 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -716,7 +716,7 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void } /* }}} */ -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; zval tmp_member; @@ -744,6 +744,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v val = zend_verify_property_type(prop_info, value, &tmp, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(member), value); + value = &EG(error_zval); goto exit; } value = val; @@ -765,6 +766,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v } } } else if (UNEXPECTED(EG(exception))) { + value = &EG(error_zval); goto exit; } @@ -772,7 +774,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v if (zobj->ce->__set) { uint32_t *guard = zend_get_property_guard(zobj, Z_STR_P(member)); - if (!((*guard) & IN_SET)) { + if (!((*guard) & IN_SET)) { zval tmp_object; ZVAL_COPY(&tmp_object, object); @@ -785,6 +787,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v } else { if (Z_STRVAL_P(member)[0] == '\0' && Z_STRLEN_P(member) != 0) { zend_throw_error(NULL, "Cannot access property started with '\\0'"); + value = &EG(error_zval); goto exit; } } @@ -827,6 +830,8 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v if (UNEXPECTED(Z_REFCOUNTED(tmp_member))) { zval_ptr_dtor(&tmp_member); } + + return value; } /* }}} */ diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index 0521b11c861e..14a2fc524ce1 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -53,9 +53,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); @@ -184,7 +185,7 @@ ZEND_API HashTable *zend_std_get_debug_info(zval *object, int *is_temp); ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int type); ZEND_API zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot); ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv); -ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot); +ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot); ZEND_API int zend_std_has_property(zval *object, zval *member, int has_set_exists, void **cache_slot); ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_slot); ZEND_API zval *zend_std_read_dimension(zval *object, zval *offset, int type, zval *rv); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 9c11bf1818d2..6f1a007d00d3 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2395,10 +2395,10 @@ ZEND_VM_C_LABEL(fast_assign_obj): ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } FREE_OP_DATA(); ZEND_VM_C_LABEL(exit_assign_obj): diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 758e22fab821..3165502f2ffe 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -25568,10 +25568,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -25709,10 +25709,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -25850,10 +25850,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -25991,10 +25991,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -28384,10 +28384,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -28525,10 +28525,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -28666,10 +28666,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -28807,10 +28807,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -32663,10 +32663,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -32804,10 +32804,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -32945,10 +32945,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -33086,10 +33086,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -35309,10 +35309,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -35450,10 +35450,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -35591,10 +35591,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -35732,10 +35732,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -37371,10 +37371,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -37512,10 +37512,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -37653,10 +37653,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -37794,10 +37794,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -40058,10 +40058,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -40199,10 +40199,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -40340,10 +40340,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -40481,10 +40481,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -45191,10 +45191,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -45332,10 +45332,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -45473,10 +45473,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -45614,10 +45614,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -49737,10 +49737,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -49878,10 +49878,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -50019,10 +50019,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -50160,10 +50160,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -56357,10 +56357,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -56498,10 +56498,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -56639,10 +56639,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -56780,10 +56780,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 0b8130ac7efd..84579b5a09e1 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -680,10 +680,10 @@ static HashTable *date_object_get_debug_info_timezone(zval *object, int *is_temp static void php_timezone_to_string(php_timezone_obj *tzobj, zval *zv); zval *date_interval_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv); -void date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot); +zval *date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot); static zval *date_interval_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot); static zval *date_period_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv); -static void date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot); +static zval *date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot); /* {{{ Module struct */ zend_module_entry date_module_entry = { @@ -4211,7 +4211,7 @@ zval *date_interval_read_property(zval *object, zval *member, int type, void **c /* }}} */ /* {{{ date_interval_write_property */ -void date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot) +zval *date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot) { php_interval_obj *obj; zval tmp_member; @@ -4225,17 +4225,18 @@ void date_interval_write_property(zval *object, zval *member, zval *value, void obj = Z_PHPINTERVAL_P(object); if (!obj->initialized) { - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); if (member == &tmp_member) { zval_dtor(member); } - return; + return value; } #define SET_VALUE_FROM_STRUCT(n,m) \ if (strcmp(Z_STRVAL_P(member), m) == 0) { \ obj->diff->n = zval_get_long(value); \ - break; \ + ZVAL_LONG(value, obj->diff->n); \ + break; \ } do { @@ -4247,16 +4248,19 @@ void date_interval_write_property(zval *object, zval *member, zval *value, void SET_VALUE_FROM_STRUCT(s, "s"); if (strcmp(Z_STRVAL_P(member), "f") == 0) { obj->diff->us = zval_get_double(value) * 1000000; + ZVAL_LONG(value, obj->diff->us); break; } SET_VALUE_FROM_STRUCT(invert, "invert"); /* didn't find any */ - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); } while(0); if (member == &tmp_member) { zval_dtor(member); } + + return value; } /* }}} */ @@ -5296,9 +5300,10 @@ static zval *date_period_read_property(zval *object, zval *member, int type, voi /* }}} */ /* {{{ date_period_write_property */ -static void date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot) +static zval *date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot) { zend_throw_error(NULL, "Writing to DatePeriod properties is unsupported"); + return value; } /* }}} */ diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c index a9220863d2fb..10b35f04a801 100644 --- a/ext/dom/php_dom.c +++ b/ext/dom/php_dom.c @@ -358,7 +358,7 @@ zval *dom_read_property(zval *object, zval *member, int type, void **cache_slot, /* }}} */ /* {{{ dom_write_property */ -void dom_write_property(zval *object, zval *member, zval *value, void **cache_slot) +zval *dom_write_property(zval *object, zval *member, zval *value, void **cache_slot) { dom_object *obj = Z_DOMOBJ_P(object); zend_string *member_str = zval_get_string(member); @@ -370,10 +370,12 @@ void dom_write_property(zval *object, zval *member, zval *value, void **cache_sl if (hnd) { hnd->write_func(obj, value); } else { - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); } zend_string_release_ex(member_str, 0); + + return value; } /* }}} */ diff --git a/ext/intl/transliterator/transliterator_class.c b/ext/intl/transliterator/transliterator_class.c index 24de8f6544f9..af9ab96d880f 100644 --- a/ext/intl/transliterator/transliterator_class.c +++ b/ext/intl/transliterator/transliterator_class.c @@ -255,8 +255,7 @@ static zval *Transliterator_read_property( zval *object, zval *member, int type, /* }}} */ /* {{{ write_property handler */ -static void Transliterator_write_property( zval *object, zval *member, zval *value, - void **cache_slot ) +static zval *Transliterator_write_property( zval *object, zval *member, zval *value, void **cache_slot ) { zend_class_entry *scope; TRANSLITERATOR_PROPERTY_HANDLER_PROLOG; @@ -274,10 +273,12 @@ static void Transliterator_write_property( zval *object, zval *member, zval *val } else { - zend_std_write_property( object, member, value, cache_slot ); + value = zend_std_write_property( object, member, value, cache_slot ); } TRANSLITERATOR_PROPERTY_HANDLER_EPILOG; + + return value; } /* }}} */ diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index c885be61c089..e5d6964bbf9d 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -333,7 +333,7 @@ zval *mysqli_read_property(zval *object, zval *member, int type, void **cache_sl /* }}} */ /* {{{ mysqli_write_property */ -void mysqli_write_property(zval *object, zval *member, zval *value, void **cache_slot) +zval *mysqli_write_property(zval *object, zval *member, zval *value, void **cache_slot) { zval tmp_member; mysqli_object *obj; @@ -353,12 +353,14 @@ void mysqli_write_property(zval *object, zval *member, zval *value, void **cache if (hnd) { hnd->write_func(obj, value); } else { - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); } if (member == &tmp_member) { zval_dtor(member); } + + return value; } /* }}} */ diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 92ce1054e0b8..87fe98ddfb31 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -6800,7 +6800,7 @@ static const zend_function_entry reflection_ext_functions[] = { /* {{{ */ }; /* }}} */ /* {{{ _reflection_write_property */ -static void _reflection_write_property(zval *object, zval *member, zval *value, void **cache_slot) +static zval *_reflection_write_property(zval *object, zval *member, zval *value, void **cache_slot) { if ((Z_TYPE_P(member) == IS_STRING) && zend_hash_exists(&Z_OBJCE_P(object)->properties_info, Z_STR_P(member)) @@ -6809,10 +6809,11 @@ static void _reflection_write_property(zval *object, zval *member, zval *value, { zend_throw_exception_ex(reflection_exception_ptr, 0, "Cannot set read-only property %s::$%s", ZSTR_VAL(Z_OBJCE_P(object)->name), Z_STRVAL_P(member)); + return &EG(uninitialized_zval); } else { - zend_std_write_property(object, member, value, cache_slot); + return zend_std_write_property(object, member, value, cache_slot); } } /* }}} */ diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 01eadf98d069..f4c4a188c921 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -421,7 +421,7 @@ static void change_node_zval(xmlNodePtr node, zval *value) /* {{{ sxe_property_write() */ -static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool elements, zend_bool attribs, xmlNodePtr *pnewnode) +static zval *sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool elements, zend_bool attribs, xmlNodePtr *pnewnode) { php_sxe_object *sxe; xmlNodePtr node; @@ -448,7 +448,7 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool * and this is during runtime. */ zend_throw_error(NULL, "Cannot create unnamed attribute"); - return FAILURE; + return &EG(error_zval); } goto long_dim; } else { @@ -472,7 +472,7 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool if (member == &tmp_zv) { zval_dtor(&tmp_zv); } - return FAILURE; + return &EG(error_zval); } } } @@ -497,7 +497,7 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool * and this is during runtime. */ zend_throw_error(NULL, "Cannot create unnamed attribute"); - return FAILURE; + return &EG(error_zval); } if (attribs && !node && sxe->iter.type == SXE_ITER_ELEMENT) { node = xmlNewChild(mynode, mynode->ns, sxe->iter.name, NULL); @@ -534,7 +534,7 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool zval_dtor(&tmp_zv); } zend_error(E_WARNING, "It is not yet possible to assign complex types to %s", attribs ? "attributes" : "properties"); - return FAILURE; + return &EG(error_zval); } } @@ -572,7 +572,7 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool if (new_value) { zval_ptr_dtor(value); } - return FAILURE; + return &EG(error_zval); } if (sxe->iter.type == SXE_ITER_NONE) { @@ -580,7 +580,7 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool ++counter; if (member && Z_LVAL_P(member) > 0) { php_error_docref(NULL, E_WARNING, "Cannot add element %s number " ZEND_LONG_FMT " when only 0 such elements exist", mynode->name, Z_LVAL_P(member)); - retval = FAILURE; + value = &EG(error_zval); } } else if (member) { newnode = sxe_get_element_by_offset(sxe, Z_LVAL_P(member), node, &cnt); @@ -617,7 +617,7 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool } } else if (counter > 1) { php_error_docref(NULL, E_WARNING, "Cannot assign to an array of nodes (duplicate subnodes or attr detected)"); - retval = FAILURE; + value = &EG(error_zval); } else if (elements) { if (!node) { if (!member || Z_TYPE_P(member) == IS_LONG) { @@ -650,16 +650,19 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool } if (new_value) { zval_ptr_dtor(value); + return new_value; } - return retval; + return value; } /* }}} */ /* {{{ sxe_property_write() */ -static void sxe_property_write(zval *object, zval *member, zval *value, void **cache_slot) +static zval *sxe_property_write(zval *object, zval *member, zval *value, void **cache_slot) { - sxe_prop_dim_write(object, member, value, 1, 0, NULL); + zval *retval = sxe_prop_dim_write(object, member, value, 1, 0, NULL); + + return retval == &EG(error_zval) ? &EG(uninitialized_zval) : retval; } /* }}} */ @@ -688,7 +691,7 @@ static zval *sxe_property_get_adr(zval *object, zval *member, int fetch_type, vo if (node) { return NULL; } - if (sxe_prop_dim_write(object, member, NULL, 1, 0, &node) != SUCCESS) { + if (sxe_prop_dim_write(object, member, NULL, 1, 0, &node) == &EG(error_zval)) { return NULL; } type = SXE_ITER_NONE; diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c index a424912a246d..ad5583ff1793 100644 --- a/ext/snmp/snmp.c +++ b/ext/snmp/snmp.c @@ -1951,7 +1951,7 @@ zval *php_snmp_read_property(zval *object, zval *member, int type, void **cache_ /* {{{ php_snmp_write_property(zval *object, zval *member, zval *value[, const zend_literal *key]) Generic object property writer */ -void php_snmp_write_property(zval *object, zval *member, zval *value, void **cache_slot) +zval *php_snmp_write_property(zval *object, zval *member, zval *value, void **cache_slot) { zval tmp_member; php_snmp_object *obj; @@ -1975,12 +1975,14 @@ void php_snmp_write_property(zval *object, zval *member, zval *value, void **cac } */ } else { - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); } if (member == &tmp_member) { zval_ptr_dtor(member); } + + return value; } /* }}} */ diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 3b9ee1a80ae9..a9148b9b004b 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -879,16 +879,16 @@ static zval *spl_array_read_property(zval *object, zval *member, int type, void return zend_std_read_property(object, member, type, cache_slot, rv); } /* }}} */ -static void spl_array_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ +static zval *spl_array_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ { spl_array_object *intern = Z_SPLARRAY_P(object); if ((intern->ar_flags & SPL_ARRAY_ARRAY_AS_PROPS) != 0 && !zend_std_has_property(object, member, 2, NULL)) { spl_array_write_dimension(object, member, value); - return; + return value; } - zend_std_write_property(object, member, value, cache_slot); + return zend_std_write_property(object, member, value, cache_slot); } /* }}} */ static zval *spl_array_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot) /* {{{ */ diff --git a/ext/standard/incomplete_class.c b/ext/standard/incomplete_class.c index 0e34b0aa26a3..65740ed8db82 100644 --- a/ext/standard/incomplete_class.c +++ b/ext/standard/incomplete_class.c @@ -62,9 +62,10 @@ static zval *incomplete_class_get_property(zval *object, zval *member, int type, } /* }}} */ -static void incomplete_class_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ +static zval *incomplete_class_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ { incomplete_class_message(object, E_NOTICE); + return value; } /* }}} */ diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index 0b84a702b8c3..863a82ef5424 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -183,7 +183,7 @@ zval *xmlreader_read_property(zval *object, zval *member, int type, void **cache /* }}} */ /* {{{ xmlreader_write_property */ -void xmlreader_write_property(zval *object, zval *member, zval *value, void **cache_slot) +zval *xmlreader_write_property(zval *object, zval *member, zval *value, void **cache_slot) { xmlreader_object *obj; zval tmp_member; @@ -202,12 +202,14 @@ void xmlreader_write_property(zval *object, zval *member, zval *value, void **ca if (hnd != NULL) { php_error_docref(NULL, E_WARNING, "Cannot write to read-only property"); } else { - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); } if (member == &tmp_member) { zval_dtor(member); } + + return value; } /* }}} */ From ebb64aef90740d424947271ac59170427e522e33 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 16 Jun 2018 19:01:24 +0200 Subject: [PATCH 254/369] Drop overeager assert Function may be used in cases where types are not set. --- Zend/zend_execute.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 54ceca4808ad..32792d2c8382 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2733,11 +2733,17 @@ static zend_always_inline void swap_types(zend_type *type1, zend_type *type2) { /* Returns intersection type, or type "void" if intersection impossible, or 0 if intersection * currently not representable. */ static zend_type compute_intersection_type(zend_type type1, zend_type type2) { - ZEND_ASSERT(ZEND_TYPE_IS_SET(type1) && ZEND_TYPE_IS_SET(type2)); if (type1 == type2) { return type1; } + /* If one of the type is "mixed", the intersection is the other type. */ + if (!ZEND_TYPE_IS_SET(type1)) { + return type2; + } else if (!ZEND_TYPE_IS_SET(type2)) { + return type1; + } + /* Intersection is nullable only if both are nullable. */ if (ZEND_TYPE_ALLOW_NULL(type1) != ZEND_TYPE_ALLOW_NULL(type2)) { type1 = ZEND_TYPE_WITHOUT_NULL(type1); From 7c96afad5b8127e3aa8c0a9022c92627f3690466 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 18 Jun 2018 00:34:03 +0200 Subject: [PATCH 255/369] Enforce reference checks on ReflectionClass::setStaticPropertyValue() + test --- ext/reflection/php_reflection.c | 20 +++++++--- ...ctionClass_setStaticPropertyValue_002.phpt | 4 +- ...ctionClass_setStaticPropertyValue_003.phpt | 39 +++++++++++++++++++ 3 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 87fe98ddfb31..1c5ab3eb6549 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3978,15 +3978,25 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) "Class %s does not have a property named %s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); return; } - ZVAL_DEREF(variable_ptr); - if (!prop_info->type || zend_verify_property_type(prop_info, value, value, EX_USES_STRICT_TYPES())) { - zval_ptr_dtor(variable_ptr); - ZVAL_COPY(variable_ptr, value); - } else { + if (Z_ISREF_P(variable_ptr)) { + zend_type ref_type = Z_REFTYPE_P(variable_ptr); + variable_ptr = Z_REFVAL_P(variable_ptr); + + if (ref_type && !zend_verify_ref_type_assignable_zval(ref_type, value, EX_USES_STRICT_TYPES())) { + zend_throw_ref_type_error(ref_type, value); + return; + } + } + + if (prop_info->type && !zend_verify_property_type(prop_info, value, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, prop_info->name, value); + return; } + zval_ptr_dtor(variable_ptr); + ZVAL_COPY(variable_ptr, value); + } /* }}} */ diff --git a/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_002.phpt b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_002.phpt index 3244ec30b90c..31c22017297c 100644 --- a/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_002.phpt +++ b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_002.phpt @@ -1,5 +1,5 @@ --TEST-- -ReflectionClass::getStaticPropertyValue() - bad params +ReflectionClass::setStaticPropertyValue() - bad params --CREDITS-- Robin Fernandes Steve Seear @@ -57,4 +57,4 @@ Class C does not have a property named Class C does not have a property named 1.5 Warning: ReflectionClass::setStaticPropertyValue() expects parameter 1 to be string, array given in %s on line 33 -NULL \ No newline at end of file +NULL diff --git a/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt new file mode 100644 index 000000000000..524985ec1e88 --- /dev/null +++ b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt @@ -0,0 +1,39 @@ +--TEST-- +ReflectionClass::setStaticPropertyValue() - type constraints must be enforced +--FILE-- +setStaticPropertyValue("y", "foo"); +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump(Test::$y); + +$rc->setStaticPropertyValue("y", "21"); +var_dump(Test::$y); + + +Test::$x =& Test::$y; + +try { + $rc->setStaticPropertyValue("x", "foo"); +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump(Test::$y); + +$rc->setStaticPropertyValue("x", "42"); +var_dump(Test::$y); + +?> +--EXPECT-- +string(48) "Typed property Test::$y must be int, string used" +int(2) +int(21) +string(45) "Cannot assign string to reference of type int" +int(21) +int(42) From 10ac5260dcc5136dc7096e796e5f7f5334ab3bd8 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 18 Jun 2018 00:50:28 +0200 Subject: [PATCH 256/369] Use coercive mode for setStaticPropertyValue() This is consistent with behavior of ReflectionProperty::setValue() and all other internal function calling --- ext/reflection/php_reflection.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 1c5ab3eb6549..074de47b6d07 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3983,13 +3983,13 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) zend_type ref_type = Z_REFTYPE_P(variable_ptr); variable_ptr = Z_REFVAL_P(variable_ptr); - if (ref_type && !zend_verify_ref_type_assignable_zval(ref_type, value, EX_USES_STRICT_TYPES())) { + if (ref_type && !zend_verify_ref_type_assignable_zval(ref_type, value, 0)) { zend_throw_ref_type_error(ref_type, value); return; } } - if (prop_info->type && !zend_verify_property_type(prop_info, value, value, EX_USES_STRICT_TYPES())) { + if (prop_info->type && !zend_verify_property_type(prop_info, value, value, 0)) { zend_verify_property_type_error(prop_info, prop_info->name, value); return; } From 452d0a715327d142e32d48cf91cb23bbf54995e5 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 18 Jun 2018 18:15:48 +0200 Subject: [PATCH 257/369] Keep track of reference types --- .../typed_properties_073.phpt | 17 +++-- .../typed_properties_078.phpt | 59 +++++++++++++++ Zend/zend_execute.c | 75 ++++++++++++++++++- Zend/zend_execute.h | 42 +++++++++++ Zend/zend_object_handlers.c | 17 +++-- Zend/zend_objects.c | 12 ++- Zend/zend_types.h | 28 ++++++- Zend/zend_vm_def.h | 32 +++++--- 8 files changed, 250 insertions(+), 32 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_078.phpt diff --git a/Zend/tests/type_declarations/typed_properties_073.phpt b/Zend/tests/type_declarations/typed_properties_073.phpt index 54576ae2cabb..7f9b4ff2de0f 100644 --- a/Zend/tests/type_declarations/typed_properties_073.phpt +++ b/Zend/tests/type_declarations/typed_properties_073.phpt @@ -14,13 +14,11 @@ class Test { $test = new Test; var_dump($test); -var_dump($intval = &$test->val); +var_dump($val = &$test->val); var_dump($test); -try { - $test->prop = "x"; -} catch (TypeError $e) { print $e->getMessage()."\n"; } -var_dump($intval); +$test->prop = "x"; +var_dump($test, $val); ?> --EXPECT-- @@ -37,5 +35,10 @@ object(Test)#1 (1) { ["val"]=> uninitialized(int) } -Cannot assign string to reference of type int -int(42) +object(Test)#1 (1) { + ["prop"]=> + &string(1) "x" + ["val"]=> + uninitialized(int) +} +string(1) "x" 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 000000000000..062c6b32c993 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_078.phpt @@ -0,0 +1,59 @@ +--TEST-- +Typed references must be kept track of and always be only the intersection of the types currently holding that reference +--FILE-- +it; +$a->a = &$ref; + +var_dump($ref); + +try { + $a->t = &$ref; +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($ref); + +$a->it = [1]; // type is still assignable +var_dump($ref); + +try { + $ref = new ArrayIterator(); +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($ref instanceof ArrayIterator); + +unset($a->a); + +$ref = null; + +$a->t = &$ref; + +try { + $ref = []; +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($ref instanceof ArrayIterator); + +$ref = new ArrayIterator(); +var_dump($ref instanceof ArrayIterator); + +?> +--EXPECT-- +array(0) { +} +string(71) "Property and reference types ?Traversable and ?array are not compatible" +array(0) { +} +array(1) { + [0]=> + int(1) +} +string(55) "Cannot assign ArrayIterator to reference of type ?array" +bool(false) +string(53) "Cannot assign array to reference of type ?Traversable" +bool(false) +bool(true) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 32792d2c8382..0b9135eb48fa 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2551,7 +2551,8 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } ZVAL_NEW_REF(ptr, ptr); - Z_REF_P(ptr)->type = zend_get_prop_info_ref_type(prop_info); + Z_REFTYPE_P(ptr) = zend_get_prop_info_ref_type(prop_info); + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ptr), prop_info); } } return; @@ -2699,12 +2700,14 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } if (by_ref && UNEXPECTED(property_info) && Z_TYPE_P(*retval) != IS_REFERENCE) { + zval *ref = *retval; if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(*retval) <= IS_NULL)) { zend_throw_error(NULL, "Cannot access uninitialized property by reference"); return FAILURE; } - ZVAL_NEW_REF(*retval, *retval); - Z_REF_P(*retval)->type = zend_get_prop_info_ref_type(property_info); + ZVAL_NEW_REF(ref, ref); + Z_REFTYPE_P(ref) = zend_get_prop_info_ref_type(property_info); + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ref), property_info); } if (prop_info) { @@ -2836,6 +2839,72 @@ ZEND_API zend_type zend_check_typed_assign_typed_ref(const char *source, zend_ty return i_zend_check_typed_assign_typed_ref(source, old_type, ref_type); } +ZEND_API void zend_ref_add_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); + + if (source_list->ptr == NULL) { + source_list->ptr = prop; + return; + } + + 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 = 0; + source_list->list = ZEND_PROPERTY_INFO_SOURCE_FROM_LIST(list); + } 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 *)); + source_list->list = ZEND_PROPERTY_INFO_SOURCE_FROM_LIST(list); + } + + list->ptr[list->num++] = prop; +} + +ZEND_API zend_type 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_type type; + zend_property_info **end, **start, **ptr; + + if (!ZEND_PROPERTY_INFO_SOURCE_IS_LIST(source_list->list)) { + source_list->ptr = NULL; + return 0; + } + + if (list->num == 1) { + efree(list); + source_list->ptr = NULL; + return 0; + } + + ptr = start = list->ptr; + if (*ptr == prop) { + *ptr = list->ptr[--list->num]; + type = (*(ptr++))->type; + } else { + type = (*(ptr++))->type; + do { + type = compute_intersection_type(type, (*ptr)->type); + } while (prop != *++ptr); + *ptr = list->ptr[--list->num]; + } + end = start + list->num; + while (ptr != end) { + type = compute_intersection_type(type, (*ptr)->type); + ptr++; + } + + 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 *))); + } + + return type; +} + static zend_never_inline void zend_fetch_this_var(int type OPLINE_DC EXECUTE_DATA_DC) { zval *result = EX_VAR(opline->result.var); diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 48876a0a8cb9..5303f1121836 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -111,6 +111,7 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval if (need_copy) { Z_TRY_DELREF_P(value); } + zval_ptr_dtor(value); return Z_REFVAL_P(variable_ptr); } if (need_copy) { @@ -469,6 +470,47 @@ static zend_always_inline zend_property_info* zend_object_fetch_property_type_in zval* zend_verify_property_type(zend_property_info *info, zval *property, zval *tmp, zend_bool strict); ZEND_COLD void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property); +#define ZEND_REF_TYPE_SOURCES(ref) \ + (ref)->sources + +#define ZEND_REF_HAS_TYPE_SOURCES(ref) \ + (ZEND_REF_TYPE_SOURCES(ref).ptr != NULL) + +ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); +ZEND_API zend_type zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); + +#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); \ + size_t _num; \ + zend_property_info *_prop; \ + 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); \ + _num = _list->num; \ + _prop = _list->ptr[--_num]; \ + } else { \ + _prop = _source_list->ptr; \ + _num = 0; \ + } \ + while (1) { \ + prop = _prop; \ + +#define ZEND_REF_FOREACH_TYPE_SOURCES_END() \ + if (_num == 0) { \ + break; \ + } \ + _prop = _list->ptr[--_num]; \ + } \ + } \ + } while (0) + END_EXTERN_C() #endif /* ZEND_EXECUTE_H */ diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index da3fabb7b8a4..cc5623e92018 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -663,23 +663,18 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) && (prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot)))) { zval *val = retval; - zend_type old_type; if (Z_ISREF_P(val)) { - zend_type new_type = zend_get_prop_info_ref_type(prop_info); - old_type = Z_REFTYPE_P(val); - if (old_type != 0 && (new_type = zend_check_typed_assign_typed_ref("Property", old_type, new_type)) == 0) { + /* the overloaded property type must be compatible with the reference type so that we don't coercively cast and end up with a value type not matching the reference type */ + if (zend_check_typed_assign_typed_ref("Property", Z_REFTYPE_P(val), zend_get_prop_info_ref_type(prop_info)) == 0) { goto exit; } - Z_REFTYPE_P(val) = new_type; + /* we do not add a reference type here - reference types must be backed up by references being assigned to an actual typed container */ val = Z_REFVAL_P(val); } if (UNEXPECTED(zend_verify_property_type(prop_info, val, val, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES)) == NULL)) { zend_verify_property_type_error(prop_info, Z_STR_P(member), val); - if (Z_ISREF_P(retval)) { - Z_REFTYPE_P(retval) = old_type; - } } } goto exit; @@ -1026,6 +1021,12 @@ ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_s zval *slot = OBJ_PROP(zobj, property_offset); if (Z_TYPE_P(slot) != IS_UNDEF) { + if (UNEXPECTED(Z_ISREF_P(slot)) && Z_REFCOUNT_P(slot) > 1) { + zend_property_info *prop_info = zend_hash_find(&zobj->ce->properties_info, Z_STR_P(member)); + if (UNEXPECTED(prop_info->type)) { + Z_REFTYPE_P(slot) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(slot), prop_info); + } + } zval_ptr_dtor(slot); ZVAL_UNDEF(slot); if (zobj->properties) { diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 00d124ff2478..c966df139e03 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -54,7 +54,17 @@ 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)) && Z_REFCOUNT_P(p) > 1) { + zend_property_info *prop_info; + ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(p), prop_info) { + if (prop_info->ce == object->ce && p == OBJ_PROP(object, prop_info->offset)) { + Z_REFTYPE_P(p) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + } + i_zval_ptr_dtor(p ZEND_FILE_LINE_CC); + } p++; } while (p != end); } diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 5d1abceb45f0..6f3c62b245b4 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -384,10 +384,28 @@ struct _zend_resource { void *ptr; }; +typedef struct _zend_property_info zend_property_info; + +typedef struct { + size_t num; + size_t num_allocated; + zend_property_info *ptr[1]; +} zend_property_info_list; + +typedef union { + zend_property_info *ptr; + uintptr_t list; +} zend_property_info_source_list; + +#define ZEND_PROPERTY_INFO_SOURCE_FROM_LIST(list) (0x1 | (uintptr_t) (list)) +#define ZEND_PROPERTY_INFO_SOURCE_TO_LIST(list) ((zend_property_info_list *) ((list) & ~0x1)) +#define ZEND_PROPERTY_INFO_SOURCE_IS_LIST(list) ((list) & 0x1) + struct _zend_reference { - zend_refcounted_h gc; - zval val; - zend_type type; + zend_refcounted_h gc; + zval val; + zend_type type; + zend_property_info_source_list sources; }; struct _zend_ast_ref { @@ -873,6 +891,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; \ _ref->type = 0; \ + _ref->sources.ptr = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ } while (0) @@ -884,6 +903,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { GC_TYPE_INFO(_ref) = IS_REFERENCE; \ ZVAL_COPY_VALUE(&_ref->val, r); \ _ref->type = 0; \ + _ref->sources.ptr = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ } while (0) @@ -896,6 +916,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { GC_TYPE_INFO(_ref) = IS_REFERENCE; \ ZVAL_COPY_VALUE(&_ref->val, _z); \ _ref->type = 0; \ + _ref->sources.ptr = NULL; \ Z_REF_P(_z) = _ref; \ Z_TYPE_INFO_P(_z) = IS_REFERENCE_EX; \ } while (0) @@ -908,6 +929,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { (GC_PERSISTENT << GC_FLAGS_SHIFT); \ ZVAL_COPY_VALUE(&_ref->val, r); \ _ref->type = 0; \ + _ref->sources.ptr = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ } while (0) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 6f1a007d00d3..93382361c7ac 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2634,7 +2634,6 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -2684,9 +2683,11 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C FREE_OP2(); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((OP2_TYPE == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + zend_bool add_ref_source = 0; + if ((OP2_TYPE == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (OP2_TYPE == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -2694,18 +2695,20 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C } if (UNEXPECTED(prop_info)) { + add_ref_source = Z_ISREF_P(variable_ptr) == 0; + ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - FREE_OP1_VAR_PTR(); - FREE_OP2(); - FREE_OP_DATA_VAR_PTR(); - HANDLE_EXCEPTION(); - } + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_OP_DATA_VAR_PTR(); + HANDLE_EXCEPTION(); } + + add_ref_source = 1; } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); @@ -2720,6 +2723,9 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + if (add_ref_source) { /* avoid double assign */ + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } @@ -2740,6 +2746,7 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| zval *prop, *value_ptr; zend_property_info *prop_info; zend_type ref_type = 0; + zend_bool add_ref_source = 0; SAVE_OPLINE(); @@ -2765,6 +2772,7 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| } else { if (UNEXPECTED(prop_info)) { ref_type = zend_get_prop_info_ref_type(prop_info); + add_ref_source = Z_ISREF_P(prop) == 0; if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -2774,6 +2782,7 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| HANDLE_EXCEPTION(); } } + add_ref_source = 1; } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); @@ -2786,6 +2795,9 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + if (add_ref_source) { /* avoid double assign */ + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { From 0023518170312a031f4a735c5472bdbb16b3d473 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Tue, 19 Jun 2018 02:07:35 +0200 Subject: [PATCH 258/369] Fix memory leaks & stupid bugs introduced in last commit --- .../typed_properties_079.phpt | 34 ++ Zend/zend_execute.c | 32 +- Zend/zend_execute.h | 3 - Zend/zend_object_handlers.c | 2 +- Zend/zend_objects.c | 3 +- Zend/zend_opcode.c | 9 + Zend/zend_vm_def.h | 23 +- Zend/zend_vm_execute.h | 420 ++++++++++++------ 8 files changed, 343 insertions(+), 183 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_079.phpt 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 000000000000..18ebf68762b4 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_079.phpt @@ -0,0 +1,34 @@ +--TEST-- +Test static typed properties with references +--FILE-- +getMessage()); } +var_dump(A::$it); + +A::$a = &$a; + +A::$it = new ArrayIterator(); + +try { + $a = 1; +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($a); + +?> +--EXPECT-- +string(54) "Cannot assign ArrayIterator to reference of type array" +array(0) { +} +string(45) "Cannot assign int to reference of type ?array" +NULL + diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 0b9135eb48fa..330d1d55c6fb 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2852,7 +2852,7 @@ ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_li 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 = 0; + list->num = 1; source_list->list = ZEND_PROPERTY_INFO_SOURCE_FROM_LIST(list); } else if (list->num_allocated == list->num) { list->num_allocated = list->num * 2; @@ -2866,36 +2866,34 @@ ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_li ZEND_API zend_type 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_type type; - zend_property_info **end, **start, **ptr; + zend_type type = 0; + zend_property_info **end, **ptr; if (!ZEND_PROPERTY_INFO_SOURCE_IS_LIST(source_list->list)) { + ZEND_ASSERT(source_list->ptr == prop); source_list->ptr = NULL; return 0; } if (list->num == 1) { + ZEND_ASSERT(*list->ptr == prop); efree(list); source_list->ptr = NULL; return 0; } - ptr = start = list->ptr; - if (*ptr == prop) { - *ptr = list->ptr[--list->num]; - type = (*(ptr++))->type; - } else { - type = (*(ptr++))->type; - do { - type = compute_intersection_type(type, (*ptr)->type); - } while (prop != *++ptr); - *ptr = list->ptr[--list->num]; - } - end = start + list->num; - while (ptr != end) { - type = compute_intersection_type(type, (*ptr)->type); + --list->num; + + ptr = list->ptr; + while (*ptr != prop) { ptr++; } + *ptr = list->ptr[list->num]; + + ptr = list->ptr, end = ptr + list->num; + do { + type = compute_intersection_type(type, (*ptr)->type); + } while (++ptr != end); if (list->num >= 4 && list->num * 4 == list->num_allocated) { list->num_allocated = list->num * 2; diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 5303f1121836..7b4a64f3eeca 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -108,9 +108,6 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval } if (!zend_verify_ref_type_assignable_zval(Z_REFTYPE_P(variable_ptr), value, strict)) { zend_throw_ref_type_error(Z_REFTYPE_P(variable_ptr), value); - if (need_copy) { - Z_TRY_DELREF_P(value); - } zval_ptr_dtor(value); return Z_REFVAL_P(variable_ptr); } diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index cc5623e92018..ee593f1103ad 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -1022,7 +1022,7 @@ ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_s if (Z_TYPE_P(slot) != IS_UNDEF) { if (UNEXPECTED(Z_ISREF_P(slot)) && Z_REFCOUNT_P(slot) > 1) { - zend_property_info *prop_info = zend_hash_find(&zobj->ce->properties_info, Z_STR_P(member)); + zend_property_info *prop_info = zend_hash_find_ptr(&zobj->ce->properties_info, Z_STR_P(member)); if (UNEXPECTED(prop_info->type)) { Z_REFTYPE_P(slot) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(slot), prop_info); } diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index c966df139e03..cd4986cce7ff 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -55,11 +55,12 @@ ZEND_API void zend_object_std_dtor(zend_object *object) end = p + object->ce->default_properties_count; do { if (Z_REFCOUNTED_P(p)) { - if (UNEXPECTED(Z_ISREF_P(p)) && Z_REFCOUNT_P(p) > 1) { + 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 == object->ce && p == OBJ_PROP(object, prop_info->offset)) { Z_REFTYPE_P(p) = 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(); } diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 2f170828d6a8..391656efebbe 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -261,6 +261,15 @@ ZEND_API void destroy_zend_class(zval *zv) zval *end = p + ce->default_static_members_count; while (p != end) { + if (UNEXPECTED(Z_ISREF_P(p))) { + zend_property_info *prop_info; + ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(p), prop_info) { + if (prop_info->ce == ce && p - ce->default_static_members_table == prop_info->offset) { + Z_REFTYPE_P(p) = 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 ZEND_FILE_LINE_CC); p++; } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 93382361c7ac..da8ebf68f38a 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2685,7 +2685,6 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C } else { zend_type ref_type = 0; zend_property_info *prop_info; - zend_bool add_ref_source = 0; if ((OP2_TYPE == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (OP2_TYPE == IS_CONST) { @@ -2695,8 +2694,6 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C } if (UNEXPECTED(prop_info)) { - add_ref_source = Z_ISREF_P(variable_ptr) == 0; - ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -2707,8 +2704,6 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C FREE_OP_DATA_VAR_PTR(); HANDLE_EXCEPTION(); } - - add_ref_source = 1; } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); @@ -2718,14 +2713,16 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C FREE_OP_DATA_VAR_PTR(); HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; - if (add_ref_source) { /* avoid double assign */ - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -2746,7 +2743,6 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| zval *prop, *value_ptr; zend_property_info *prop_info; zend_type ref_type = 0; - zend_bool add_ref_source = 0; SAVE_OPLINE(); @@ -2772,7 +2768,6 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| } else { if (UNEXPECTED(prop_info)) { ref_type = zend_get_prop_info_ref_type(prop_info); - add_ref_source = Z_ISREF_P(prop) == 0; if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -2782,7 +2777,6 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| HANDLE_EXCEPTION(); } } - add_ref_source = 1; } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); @@ -2790,14 +2784,15 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| FREE_OP_DATA_VAR_PTR(); HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; - if (add_ref_source) { /* avoid double assign */ - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 3165502f2ffe..02b850d2092f 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5328,11 +5328,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -5391,11 +5395,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8787,11 +8795,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8850,11 +8862,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -9734,11 +9750,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -9797,11 +9817,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -15261,11 +15285,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -15324,11 +15352,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -17658,11 +17690,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -17721,11 +17757,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -18349,11 +18389,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -18412,11 +18456,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -26419,7 +26467,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -26469,9 +26516,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -26483,13 +26531,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -26500,11 +26546,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -26527,7 +26578,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -26577,9 +26627,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -26591,13 +26642,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -26608,11 +26657,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -29179,7 +29233,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -29229,9 +29282,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -29243,13 +29297,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -29260,11 +29312,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -29287,7 +29344,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -29337,9 +29393,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -29351,13 +29408,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - zval_ptr_dtor_nogc(free_op2); + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -29368,11 +29423,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -33562,7 +33622,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -33612,9 +33671,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -33626,13 +33686,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -33643,11 +33701,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -33670,7 +33733,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -33720,9 +33782,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -33734,13 +33797,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -33751,11 +33812,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -35754,7 +35820,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -35804,9 +35869,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -35818,13 +35884,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -35835,11 +35899,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -35861,7 +35930,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -35911,9 +35979,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -35925,13 +35994,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -35942,11 +36009,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -37816,7 +37888,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -37866,9 +37937,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -37880,13 +37952,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -37897,11 +37967,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -37923,7 +37998,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -37973,9 +38047,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -37987,13 +38062,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -38004,11 +38077,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -40503,7 +40581,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -40553,9 +40630,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -40567,13 +40645,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -40584,11 +40660,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -40610,7 +40691,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -40660,9 +40740,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -40674,13 +40755,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -40691,11 +40770,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -46250,7 +46334,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -46300,9 +46383,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -46314,13 +46398,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -46331,11 +46413,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -46357,7 +46444,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -46407,9 +46493,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -46421,13 +46508,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -46438,11 +46523,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -46503,11 +46593,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -46566,11 +46660,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -50532,7 +50630,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -50582,9 +50679,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -50596,13 +50694,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -50613,11 +50709,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -50639,7 +50740,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -50689,9 +50789,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -50703,13 +50804,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -50720,11 +50819,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -52083,11 +52187,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -52146,11 +52254,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -53668,11 +53780,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -53731,11 +53847,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -57256,7 +57376,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -57306,9 +57425,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -57320,13 +57440,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -57337,11 +57455,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -57363,7 +57486,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -57413,9 +57535,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -57427,13 +57550,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -57444,11 +57565,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } From c69f8d038ce3bd768948d65370dbf55f5696678f Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Tue, 19 Jun 2018 02:59:32 +0200 Subject: [PATCH 259/369] Fix static property ref assignment without types --- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 36 ++++++++++++++++++------------------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index da8ebf68f38a..be45d588e804 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2766,7 +2766,7 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 02b850d2092f..6154cc0b8606 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5310,7 +5310,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -5377,7 +5377,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -8777,7 +8777,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -8844,7 +8844,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -9732,7 +9732,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -9799,7 +9799,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -15267,7 +15267,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -15334,7 +15334,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -17672,7 +17672,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -17739,7 +17739,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -18371,7 +18371,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -18438,7 +18438,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -46575,7 +46575,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -46642,7 +46642,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -52169,7 +52169,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -52236,7 +52236,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -53762,7 +53762,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -53829,7 +53829,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); From f00a4df058ac91b103b477d8d0c3b1a5e35d9254 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 20 Jun 2018 04:28:52 +0200 Subject: [PATCH 260/369] extract() must check typed refs when overwriting Thanks @nikic for testing this --- Zend/zend_API.h | 12 ++++-- ext/standard/array.c | 42 +++++++++++-------- .../tests/array/extract_typed_ref.phpt | 23 ++++++++++ 3 files changed, 56 insertions(+), 21 deletions(-) create mode 100644 ext/standard/tests/array/extract_typed_ref.phpt diff --git a/Zend/zend_API.h b/Zend/zend_API.h index cdc632798022..5d7a39da931e 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -685,17 +685,19 @@ END_EXTERN_C() #define ZEND_GINIT_FUNCTION ZEND_MODULE_GLOBALS_CTOR_D #define ZEND_GSHUTDOWN_FUNCTION ZEND_MODULE_GLOBALS_DTOR_D -static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { +static zend_always_inline int zend_try_assign_ex(zval *zv, zval *arg, zend_bool silent, zend_bool strict) { zend_type ref_type; if (EXPECTED(Z_ISREF_P(zv)) && UNEXPECTED(ZEND_TYPE_IS_SET(ref_type = Z_REFTYPE_P(zv)))) { zval tmp; ZVAL_COPY(&tmp, arg); - if (zend_verify_ref_type_assignable_zval(ref_type, &tmp, ZEND_ARG_USES_STRICT_TYPES())) { + if (zend_verify_ref_type_assignable_zval(ref_type, &tmp, strict)) { zv = Z_REFVAL_P(zv); zval_ptr_dtor(zv); ZVAL_COPY_VALUE(zv, &tmp); } else { - zend_throw_ref_type_error(ref_type, &tmp); + if (!silent) { + zend_throw_ref_type_error(ref_type, &tmp); + } zval_ptr_dtor(&tmp); return FAILURE; } @@ -708,6 +710,10 @@ static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { return SUCCESS; } +static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { + return zend_try_assign_ex(zv, arg, 0, ZEND_ARG_USES_STRICT_TYPES()); +} + #define ZEND_TRY_ASSIGN(func, zv, ...) \ do { \ zval _zv; \ diff --git a/ext/standard/array.c b/ext/standard/array.c index eb89c7061b61..d440af8a3a2e 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1808,9 +1808,10 @@ static zend_long php_extract_if_exists(zend_array *arr, zend_array *symbol_table continue; } ZVAL_DEREF(entry); - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY(orig_var, entry); + if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { + exception_thrown = 1; + continue; + } count++; } } ZEND_HASH_FOREACH_END(); @@ -1900,9 +1901,10 @@ static zend_long php_extract_overwrite(zend_array *arr, zend_array *symbol_table continue; } ZVAL_DEREF(entry); - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY(orig_var, entry); + if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { + exception_thrown = 1; + continue; + } } else { ZVAL_DEREF(entry); Z_TRY_ADDREF_P(entry); @@ -2009,9 +2011,10 @@ static zend_long php_extract_prefix_if_exists(zend_array *arr, zend_array *symbo if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY(orig_var, entry); + if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { + exception_thrown = 1; + continue; + } } else { Z_TRY_ADDREF_P(entry); zend_hash_add_new(symbol_table, Z_STR(final_name), entry); @@ -2145,9 +2148,10 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY(orig_var, entry); + if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { + exception_thrown = 1; + continue; + } } else { Z_TRY_ADDREF_P(entry); zend_hash_add_new(symbol_table, Z_STR(final_name), entry); @@ -2259,9 +2263,10 @@ static zend_long php_extract_prefix_all(zend_array *arr, zend_array *symbol_tabl if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY(orig_var, entry); + if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { + exception_thrown = 1; + continue; + } } else { Z_TRY_ADDREF_P(entry); zend_hash_add_new(symbol_table, Z_STR(final_name), entry); @@ -2372,9 +2377,10 @@ static zend_long php_extract_prefix_invalid(zend_array *arr, zend_array *symbol_ if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY(orig_var, entry); + if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { + exception_thrown = 1; + continue; + } } else { Z_TRY_ADDREF_P(entry); zend_hash_add_new(symbol_table, Z_STR(final_name), entry); diff --git a/ext/standard/tests/array/extract_typed_ref.phpt b/ext/standard/tests/array/extract_typed_ref.phpt new file mode 100644 index 000000000000..d329f2b7b105 --- /dev/null +++ b/ext/standard/tests/array/extract_typed_ref.phpt @@ -0,0 +1,23 @@ +--TEST-- +extract() into typed references must respect their type +--FILE-- +i; +$s =& $test->s; +try { + extract(['i' => 'foo', 's' => 42]); +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($test->i, $test->s); + +?> +--EXPECT-- +string(45) "Cannot assign string to reference of type int" +int(0) +string(2) "42" From 1228d70c7fa62cee930ef12b250119126f5aed7b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 20 Jun 2018 15:52:53 +0200 Subject: [PATCH 261/369] Mark subpats as ARRAY_ASSIGNABLE --- ext/pcre/php_pcre.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index ffecc394221f..d2810921b77c 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -938,7 +938,7 @@ static void php_do_pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global) /* {{{ * Z_PARAM_STR(regex) Z_PARAM_STR(subject) Z_PARAM_OPTIONAL - Z_PARAM_ZVAL_DEREF(subpats) + Z_PARAM_ARRAY_ASSIGNABLE(subpats) Z_PARAM_LONG(flags) Z_PARAM_LONG(start_offset) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); From 440a78a7d4246bd90d400936f5c601a5e6d48592 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 20 Jun 2018 15:54:17 +0200 Subject: [PATCH 262/369] Use TRY_ASSIGN_LONG for zcount parameters --- ext/pcre/php_pcre.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index d2810921b77c..c672d2a7fff5 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -2179,7 +2179,7 @@ static void preg_replace_common(INTERNAL_FUNCTION_PARAMETERS, int is_filter) Z_PARAM_ZVAL(subject) Z_PARAM_OPTIONAL Z_PARAM_LONG(limit) - Z_PARAM_ZVAL_DEREF(zcount) + Z_PARAM_ZVAL(zcount) ZEND_PARSE_PARAMETERS_END(); if (Z_TYPE_P(replace) != IS_ARRAY) { @@ -2245,8 +2245,7 @@ static void preg_replace_common(INTERNAL_FUNCTION_PARAMETERS, int is_filter) } if (zcount) { - zval_ptr_dtor(zcount); - ZVAL_LONG(zcount, replace_count); + ZEND_TRY_ASSIGN_LONG(zcount, replace_count); } } /* }}} */ @@ -2276,7 +2275,7 @@ static PHP_FUNCTION(preg_replace_callback) Z_PARAM_ZVAL(subject) Z_PARAM_OPTIONAL Z_PARAM_LONG(limit) - Z_PARAM_ZVAL_DEREF(zcount) + Z_PARAM_ZVAL(zcount) ZEND_PARSE_PARAMETERS_END(); if (!zend_is_callable_ex(replace, NULL, 0, NULL, &fcc, NULL)) { @@ -2293,8 +2292,7 @@ static PHP_FUNCTION(preg_replace_callback) replace_count = preg_replace_func_impl(return_value, regex, &fci, &fcc, subject, limit); if (zcount) { - zval_ptr_dtor(zcount); - ZVAL_LONG(zcount, replace_count); + ZEND_TRY_ASSIGN_LONG(zcount, replace_count); } } /* }}} */ @@ -2316,7 +2314,7 @@ static PHP_FUNCTION(preg_replace_callback_array) Z_PARAM_ZVAL(subject) Z_PARAM_OPTIONAL Z_PARAM_LONG(limit) - Z_PARAM_ZVAL_DEREF(zcount) + Z_PARAM_ZVAL(zcount) ZEND_PARSE_PARAMETERS_END(); fci.size = sizeof(fci); @@ -2361,8 +2359,7 @@ static PHP_FUNCTION(preg_replace_callback_array) } ZEND_HASH_FOREACH_END(); if (zcount) { - zval_ptr_dtor(zcount); - ZVAL_LONG(zcount, replace_count); + ZEND_TRY_ASSIGN_LONG(zcount, replace_count); } } /* }}} */ From c6f5f13657f191a556c52cb4d4cd729081be2e70 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 20 Jun 2018 16:36:31 +0200 Subject: [PATCH 263/369] Fix refcounting of zend_try_assign() --- Zend/zend_API.h | 2 +- ext/standard/array.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 5d7a39da931e..6e3942f54108 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -689,7 +689,7 @@ static zend_always_inline int zend_try_assign_ex(zval *zv, zval *arg, zend_bool zend_type ref_type; if (EXPECTED(Z_ISREF_P(zv)) && UNEXPECTED(ZEND_TYPE_IS_SET(ref_type = Z_REFTYPE_P(zv)))) { zval tmp; - ZVAL_COPY(&tmp, arg); + ZVAL_COPY_VALUE(&tmp, arg); if (zend_verify_ref_type_assignable_zval(ref_type, &tmp, strict)) { zv = Z_REFVAL_P(zv); zval_ptr_dtor(zv); diff --git a/ext/standard/array.c b/ext/standard/array.c index d440af8a3a2e..a3cbed9b0790 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1808,6 +1808,7 @@ static zend_long php_extract_if_exists(zend_array *arr, zend_array *symbol_table continue; } ZVAL_DEREF(entry); + Z_TRY_ADDREF_P(entry); if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { exception_thrown = 1; continue; @@ -1901,6 +1902,7 @@ static zend_long php_extract_overwrite(zend_array *arr, zend_array *symbol_table continue; } ZVAL_DEREF(entry); + Z_TRY_ADDREF_P(entry); if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { exception_thrown = 1; continue; @@ -2011,6 +2013,7 @@ static zend_long php_extract_prefix_if_exists(zend_array *arr, zend_array *symbo if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } + Z_TRY_ADDREF_P(entry); if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { exception_thrown = 1; continue; @@ -2148,6 +2151,7 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } + Z_TRY_ADDREF_P(entry); if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { exception_thrown = 1; continue; @@ -2263,6 +2267,7 @@ static zend_long php_extract_prefix_all(zend_array *arr, zend_array *symbol_tabl if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } + Z_TRY_ADDREF_P(entry); if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { exception_thrown = 1; continue; @@ -2377,6 +2382,7 @@ static zend_long php_extract_prefix_invalid(zend_array *arr, zend_array *symbol_ if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } + Z_TRY_ADDREF_P(entry); if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { exception_thrown = 1; continue; From 693a603eaafd298a869a5b97244807f0e11c33ba Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 21 Jun 2018 11:30:37 +0200 Subject: [PATCH 264/369] Enforce reference type in settype() --- Zend/zend_execute.c | 2 +- ext/standard/type.c | 30 ++++++++++++++++++------------ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 330d1d55c6fb..4bdb0d2ec9b0 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2689,7 +2689,7 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, if (UNEXPECTED(success != SUCCESS)) { return FAILURE; } - } + } 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_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), diff --git a/ext/standard/type.c b/ext/standard/type.c index 24b6ac7f61c0..a2a92df29f52 100644 --- a/ext/standard/type.c +++ b/ext/standard/type.c @@ -47,40 +47,46 @@ PHP_FUNCTION(settype) { zval *var; char *type; - size_t type_len = 0; + size_t type_len; + zval tmp; ZEND_PARSE_PARAMETERS_START(2, 2) - Z_PARAM_ZVAL_DEREF(var) + Z_PARAM_ZVAL(var) Z_PARAM_STRING(type, type_len) ZEND_PARSE_PARAMETERS_END(); + ZVAL_COPY(&tmp, var); if (!strcasecmp(type, "integer")) { - convert_to_long(var); + convert_to_long(&tmp); } else if (!strcasecmp(type, "int")) { - convert_to_long(var); + convert_to_long(&tmp); } else if (!strcasecmp(type, "float")) { - convert_to_double(var); + convert_to_double(&tmp); } else if (!strcasecmp(type, "double")) { /* deprecated */ - convert_to_double(var); + convert_to_double(&tmp); } else if (!strcasecmp(type, "string")) { - convert_to_string(var); + convert_to_string(&tmp); } else if (!strcasecmp(type, "array")) { - convert_to_array(var); + convert_to_array(&tmp); } else if (!strcasecmp(type, "object")) { - convert_to_object(var); + convert_to_object(&tmp); } else if (!strcasecmp(type, "bool")) { - convert_to_boolean(var); + convert_to_boolean(&tmp); } else if (!strcasecmp(type, "boolean")) { - convert_to_boolean(var); + convert_to_boolean(&tmp); } else if (!strcasecmp(type, "null")) { - convert_to_null(var); + convert_to_null(&tmp); } else if (!strcasecmp(type, "resource")) { + zval_ptr_dtor(&tmp); php_error_docref(NULL, E_WARNING, "Cannot convert to resource type"); RETURN_FALSE; } else { + zval_ptr_dtor(&tmp); php_error_docref(NULL, E_WARNING, "Invalid type"); RETURN_FALSE; } + + zend_try_assign(var, &tmp); RETVAL_TRUE; } /* }}} */ From 2d47e84d4b10b838a26a7d38bb4112ae17fe60c5 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 21 Jun 2018 13:01:14 +0200 Subject: [PATCH 265/369] Make ZEND_TRY_ASSIGN_* implementation less magic Should also fix the windows build. --- Zend/zend_API.h | 55 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 6e3942f54108..85b11ad1ff3f 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -714,20 +714,47 @@ static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { return zend_try_assign_ex(zv, arg, 0, ZEND_ARG_USES_STRICT_TYPES()); } -#define ZEND_TRY_ASSIGN(func, zv, ...) \ - do { \ - zval _zv; \ - func(&_zv, ##__VA_ARGS__); \ - zend_try_assign(zv, &_zv); \ - } while (0) - -#define ZEND_TRY_ASSIGN_NULL(zv) ZEND_TRY_ASSIGN(ZVAL_NULL, zv) -#define ZEND_TRY_ASSIGN_LONG(zv, long) ZEND_TRY_ASSIGN(ZVAL_LONG, zv, long) -#define ZEND_TRY_ASSIGN_DOUBLE(zv, double) ZEND_TRY_ASSIGN(ZVAL_DOUBLE, zv, double) -#define ZEND_TRY_ASSIGN_EMPTY_STRING(zv) ZEND_TRY_ASSIGN(ZVAL_EMPTY_STRING, zv) -#define ZEND_TRY_ASSIGN_STR(zv, str) ZEND_TRY_ASSIGN(ZVAL_STR, zv, str) -#define ZEND_TRY_ASSIGN_STRING(zv, string) ZEND_TRY_ASSIGN(ZVAL_STRING, zv, string) -#define ZEND_TRY_ASSIGN_STRINGL(zv, string, len) ZEND_TRY_ASSIGN(ZVAL_STRINGL, zv, string, len) +#define ZEND_TRY_ASSIGN_NULL(zv) do { \ + zval _zv; \ + ZVAL_NULL(&_zv); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_LONG(zv, lval) do { \ + zval _zv; \ + ZVAL_LONG(&_zv, lval); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_DOUBLE(zv, dval) do { \ + zval _zv; \ + ZVAL_DOUBLE(&_zv, dval); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_EMPTY_STRING(zv) do { \ + zval _zv; \ + ZVAL_EMPTY_STRING(&_zv); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_STR(zv, str) do { \ + zval _zv; \ + ZVAL_STR(&_zv, str); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_STRING(zv, string) do { \ + zval _zv; \ + ZVAL_STRING(&_zv, string); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_STRINGL(zv, string, len) do { \ + zval _zv; \ + ZVAL_STRINGL(&_zv, string, len); \ + zend_try_assign(zv, &_zv); \ +} while (0) /* Fast parameter parsing API */ From f6ad85fb13594b0f1b12733bb30eb2cc9ed26fe4 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 21 Jun 2018 20:35:03 +0200 Subject: [PATCH 266/369] Unmangle property name before printing We could also use the name from op1 (what we do for non-static properties), but as it is conditionally fetched, just unmangling the name is simpler. --- .../typed_properties_080.phpt | 37 +++++++++++++++++++ Zend/zend_execute.c | 4 +- 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_080.phpt 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 000000000000..18f7a7cf3bd8 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_080.phpt @@ -0,0 +1,37 @@ +--TEST-- +Access to typed static properties before initialization +--FILE-- +getMessage(), "\n"; + } + try { + self::$b; + } catch (TypeError $e) { + echo $e->getMessage(), "\n"; + } + try { + self::$c; + } catch (TypeError $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/zend_execute.c b/Zend/zend_execute.c index 4bdb0d2ec9b0..ae13f7e16bc7 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2692,10 +2692,12 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } if ((fetch_type == BP_VAR_R || fetch_type == BP_VAR_RW) && UNEXPECTED(Z_TYPE_P(*retval) == IS_UNDEF) && UNEXPECTED(property_info->type != 0)) { + const char *class_name, *prop_name; + zend_unmangle_property_name_ex(property_info->name, &class_name, &prop_name, NULL); zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), "Typed static property %s::$%s must not be accessed before initialization", ZSTR_VAL(property_info->ce->name), - ZSTR_VAL(property_info->name)); + prop_name); return FAILURE; } From 898cd3d56be9a3883ee78632eaa1f14cee2390b0 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 22 Jun 2018 23:48:02 +0200 Subject: [PATCH 267/369] Fix reference type tracking on clone --- .../typed_properties_081.phpt | 23 +++++++++++++++++++ Zend/zend_objects.c | 9 ++++++++ 2 files changed, 32 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_081.phpt 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 000000000000..e432b73e31f7 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_081.phpt @@ -0,0 +1,23 @@ +--TEST-- +Clone must inherit typed references +--FILE-- +x; +$test2 = clone $test; +unset($test); +try { + $x = "foo"; +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($test2->x); + +?> +--EXPECT-- +string(45) "Cannot assign string to reference of type int" +int(42) + diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index cd4986cce7ff..22aa69d0252b 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -185,6 +185,15 @@ ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object, i_zval_ptr_dtor(dst ZEND_FILE_LINE_CC); ZVAL_COPY_VALUE(dst, src); zval_add_ref(dst); + if (UNEXPECTED(Z_ISREF_P(dst)) && UNEXPECTED(Z_REFTYPE_P(dst) != NULL)) { + zend_property_info *prop_info; + ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(dst), prop_info) { + if (prop_info->ce == new_object->ce && dst == OBJ_PROP(new_object, prop_info->offset)) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(dst), prop_info); + break; /* stop iteration here, the array might be realloc()'ed */ + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + } src++; dst++; } while (src != end); From 767b2e5c4385096ddd610aeb9d76f2e87054e6ed Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 25 Jun 2018 19:02:20 +0200 Subject: [PATCH 268/369] Update extensions for ZEND_TRY_ASSIGN_* --- Zend/zend_API.h | 24 ++++++++++++ ext/intl/idn/idn.c | 2 +- ext/ldap/ldap.c | 57 ++++++++++++---------------- ext/oci8/oci8_interface.c | 2 +- ext/odbc/php_odbc.c | 4 +- ext/openssl/openssl.c | 76 ++++++++++++++++--------------------- ext/soap/soap.c | 4 +- ext/sockets/sockets.c | 42 +++++++------------- ext/standard/dns_win32.c | 4 +- ext/sysvmsg/sysvmsg.c | 38 +++++++++---------- ext/xmlrpc/xmlrpc-epi-php.c | 8 ++-- 11 files changed, 122 insertions(+), 139 deletions(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 85b11ad1ff3f..43e207de694a 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -720,6 +720,18 @@ static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { zend_try_assign(zv, &_zv); \ } while (0) +#define ZEND_TRY_ASSIGN_FALSE(zv) do { \ + zval _zv; \ + ZVAL_FALSE(&_zv); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_TRUE(zv) do { \ + zval _zv; \ + ZVAL_TRUE(&_zv); \ + zend_try_assign(zv, &_zv); \ +} while (0) + #define ZEND_TRY_ASSIGN_LONG(zv, lval) do { \ zval _zv; \ ZVAL_LONG(&_zv, lval); \ @@ -744,6 +756,12 @@ static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { zend_try_assign(zv, &_zv); \ } while (0) +#define ZEND_TRY_ASSIGN_NEW_STR(zv, str) do { \ + zval _zv; \ + ZVAL_NEW_STR(&_zv, str); \ + zend_try_assign(zv, &_zv); \ +} while (0) + #define ZEND_TRY_ASSIGN_STRING(zv, string) do { \ zval _zv; \ ZVAL_STRING(&_zv, string); \ @@ -756,6 +774,12 @@ static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { zend_try_assign(zv, &_zv); \ } while (0) +#define ZEND_TRY_ASSIGN_RES(zv, res) do { \ + zval _zv; \ + ZVAL_RES(&_zv, res); \ + zend_try_assign(zv, &_zv); \ +} while (0) + /* Fast parameter parsing API */ /* Fast ZPP is always enabled now; this define is left in for compatibility diff --git a/ext/intl/idn/idn.c b/ext/intl/idn/idn.c index 02e341fa3879..5d8943c4b3a0 100644 --- a/ext/intl/idn/idn.c +++ b/ext/intl/idn/idn.c @@ -279,7 +279,7 @@ static void php_intl_idn_handoff(INTERNAL_FUNCTION_PARAMETERS, int mode) intl_error_reset(NULL); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|llz/", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|llt", &domain, &option, &variant, &idna_info) == FAILURE) { php_intl_bad_args("bad arguments"); RETURN_NULL(); /* don't set FALSE because that's not the way it was before... */ diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index 5e8920b7d9aa..2a654e43761a 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -3330,7 +3330,7 @@ PHP_FUNCTION(ldap_parse_result) char *lmatcheddn, *lerrmsg; int rc, lerrcode, myargcount = ZEND_NUM_ARGS(); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrz/|z/z/z/z/", &link, &result, &errcode, &matcheddn, &errmsg, &referrals, &serverctrls) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrz|zztt", &link, &result, &errcode, &matcheddn, &errmsg, &referrals, &serverctrls) != SUCCESS) { return; } @@ -3353,8 +3353,7 @@ PHP_FUNCTION(ldap_parse_result) RETURN_FALSE; } - zval_ptr_dtor(errcode); - ZVAL_LONG(errcode, lerrcode); + ZEND_TRY_ASSIGN_LONG(errcode, lerrcode); /* Reverse -> fall through */ switch (myargcount) { @@ -3372,19 +3371,17 @@ PHP_FUNCTION(ldap_parse_result) ldap_memvfree((void**)lreferrals); } case 5: - zval_ptr_dtor(errmsg); if (lerrmsg == NULL) { - ZVAL_EMPTY_STRING(errmsg); + ZEND_TRY_ASSIGN_EMPTY_STRING(errmsg); } else { - ZVAL_STRING(errmsg, lerrmsg); + ZEND_TRY_ASSIGN_STRING(errmsg, lerrmsg); ldap_memfree(lerrmsg); } case 4: - zval_ptr_dtor(matcheddn); if (lmatcheddn == NULL) { - ZVAL_EMPTY_STRING(matcheddn); + ZEND_TRY_ASSIGN_EMPTY_STRING(matcheddn); } else { - ZVAL_STRING(matcheddn, lmatcheddn); + ZEND_TRY_ASSIGN_STRING(matcheddn, lmatcheddn); ldap_memfree(lmatcheddn); } } @@ -3395,7 +3392,7 @@ PHP_FUNCTION(ldap_parse_result) /* {{{ Extended operation response parsing, Pierangelo Masarati */ #ifdef HAVE_LDAP_PARSE_EXTENDED_RESULT -/* {{{ proto bool ldap_parse_exop(resource link, resource result [, string retdata [, string retoid]]) +/* {{{ proto bool ldap_parse_exop(resource link, resource result [, string &retdata [, string &retoid]]) Extract information from extended operation result */ PHP_FUNCTION(ldap_parse_exop) { @@ -3406,7 +3403,7 @@ PHP_FUNCTION(ldap_parse_exop) struct berval *lretdata; int rc, myargcount = ZEND_NUM_ARGS(); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr|z/z/", &link, &result, &retdata, &retoid) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr|zz", &link, &result, &retdata, &retoid) != SUCCESS) { WRONG_PARAM_COUNT; } @@ -3430,20 +3427,18 @@ PHP_FUNCTION(ldap_parse_exop) /* Reverse -> fall through */ switch (myargcount) { case 4: - zval_dtor(retoid); if (lretoid == NULL) { - ZVAL_EMPTY_STRING(retoid); + ZEND_TRY_ASSIGN_EMPTY_STRING(retoid); } else { - ZVAL_STRING(retoid, lretoid); + ZEND_TRY_ASSIGN_STRING(retoid, lretoid); ldap_memfree(lretoid); } case 3: /* use arg #3 as the data returned by the server */ - zval_dtor(retdata); if (lretdata == NULL) { - ZVAL_EMPTY_STRING(retdata); + ZEND_TRY_ASSIGN_EMPTY_STRING(retdata); } else { - ZVAL_STRINGL(retdata, lretdata->bv_val, lretdata->bv_len); + ZEND_TRY_ASSIGN_STRINGL(retdata, lretdata->bv_val, lretdata->bv_len); ldap_memfree(lretdata->bv_val); ldap_memfree(lretdata); } @@ -3521,7 +3516,7 @@ PHP_FUNCTION(ldap_next_reference) /* }}} */ #ifdef HAVE_LDAP_PARSE_REFERENCE -/* {{{ proto bool ldap_parse_reference(resource link, resource reference_entry, array referrals) +/* {{{ proto bool ldap_parse_reference(resource link, resource reference_entry, array &referrals) Extract information from reference entry */ PHP_FUNCTION(ldap_parse_reference) { @@ -3530,7 +3525,7 @@ PHP_FUNCTION(ldap_parse_reference) ldap_resultentry *resultentry; char **lreferrals, **refp; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrz/", &link, &result_entry, &referrals) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrt", &link, &result_entry, &referrals) != SUCCESS) { return; } @@ -4012,7 +4007,7 @@ PHP_FUNCTION(ldap_control_paged_result_response) ber_tag_t tag; int rc, lerrcode, myargcount = ZEND_NUM_ARGS(); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr|z/z/", &link, &result, &cookie, &estimated) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr|zz", &link, &result, &cookie, &estimated) != SUCCESS) { return; } @@ -4079,15 +4074,13 @@ PHP_FUNCTION(ldap_control_paged_result_response) ldap_controls_free(lserverctrls); if (myargcount == 4) { - zval_dtor(estimated); - ZVAL_LONG(estimated, lestimated); + ZEND_TRY_ASSIGN_LONG(estimated, lestimated); } - zval_ptr_dtor(cookie); if (lcookie.bv_len == 0) { - ZVAL_EMPTY_STRING(cookie); + ZEND_TRY_ASSIGN_EMPTY_STRING(cookie); } else { - ZVAL_STRINGL(cookie, lcookie.bv_val, lcookie.bv_len); + ZEND_TRY_ASSIGN_STRINGL(cookie, lcookie.bv_val, lcookie.bv_len); } ldap_memfree(lcookie.bv_val); @@ -4112,7 +4105,7 @@ PHP_FUNCTION(ldap_exop) LDAPControl **lserverctrls = NULL; int rc, msgid; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS|S!a!z/z/", &link, &reqoid, &reqdata, &serverctrls, &retdata, &retoid) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS|S!a!zz", &link, &reqoid, &reqdata, &serverctrls, &retdata, &retoid) != SUCCESS) { return; } @@ -4150,22 +4143,20 @@ PHP_FUNCTION(ldap_exop) } if (retoid) { - zval_dtor(retoid); if (lretoid) { - ZVAL_STRING(retoid, lretoid); + ZEND_TRY_ASSIGN_STRING(retoid, lretoid); ldap_memfree(lretoid); } else { - ZVAL_EMPTY_STRING(retoid); + ZEND_TRY_ASSIGN_EMPTY_STRING(retoid); } } - zval_dtor(retdata); if (lretdata) { - ZVAL_STRINGL(retdata, lretdata->bv_val, lretdata->bv_len); + ZEND_TRY_ASSIGN_STRINGL(retdata, lretdata->bv_val, lretdata->bv_len); ldap_memfree(lretdata->bv_val); ldap_memfree(lretdata); } else { - ZVAL_EMPTY_STRING(retdata); + ZEND_TRY_ASSIGN_EMPTY_STRING(retdata); } RETVAL_TRUE; @@ -4216,7 +4207,7 @@ PHP_FUNCTION(ldap_exop_passwd) int rc, myargcount = ZEND_NUM_ARGS(), msgid, err; char* errmsg; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|zzzz/", &link, &user, &oldpw, &newpw, &serverctrls) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|zzzt", &link, &user, &oldpw, &newpw, &serverctrls) == FAILURE) { WRONG_PARAM_COUNT; } diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index ceeaefeb778e..140613ec5874 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1434,7 +1434,7 @@ PHP_FUNCTION(oci_fetch_all) int i; zend_long rows = 0, flags = 0, skip = 0, maxrows = -1; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/|lll", &z_statement, &array, &skip, &maxrows, &flags) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rt|lll", &z_statement, &array, &skip, &maxrows, &flags) == FAILURE) { return; } diff --git a/ext/odbc/php_odbc.c b/ext/odbc/php_odbc.c index 0ecdee98e57c..198f5fce0702 100644 --- a/ext/odbc/php_odbc.c +++ b/ext/odbc/php_odbc.c @@ -1880,13 +1880,13 @@ PHP_FUNCTION(odbc_fetch_into) #endif /* HAVE_SQL_EXTENDED_FETCH */ #ifdef HAVE_SQL_EXTENDED_FETCH - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/|l", &pv_res, &pv_res_arr, &pv_row) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rt|l", &pv_res, &pv_res_arr, &pv_row) == FAILURE) { return; } rownum = pv_row; #else - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/", &pv_res, &pv_res_arr) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rt", &pv_res, &pv_res_arr) == FAILURE) { return; } #endif /* HAVE_SQL_EXTENDED_FETCH */ diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 136248b3410f..1106f2afbe7c 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -3525,7 +3525,7 @@ PHP_FUNCTION(openssl_csr_new) int we_made_the_key = 1; zend_resource *key_resource; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "az/|a!a!", &dn, &out_pkey, &args, &attribs) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "az|a!a!", &dn, &out_pkey, &args, &attribs) == FAILURE) { return; } RETVAL_FALSE; @@ -3533,9 +3533,12 @@ PHP_FUNCTION(openssl_csr_new) PHP_SSL_REQ_INIT(&req); if (PHP_SSL_REQ_PARSE(&req, args) == SUCCESS) { + zval *out_pkey_val = out_pkey; + ZVAL_DEREF(out_pkey_val); + /* Generate or use a private key */ - if (Z_TYPE_P(out_pkey) != IS_NULL) { - req.priv_key = php_openssl_evp_from_zval(out_pkey, 0, NULL, 0, 0, &key_resource); + if (Z_TYPE_P(out_pkey_val) != IS_NULL) { + req.priv_key = php_openssl_evp_from_zval(out_pkey_val, 0, NULL, 0, 0, &key_resource); if (req.priv_key != NULL) { we_made_the_key = 0; } @@ -3573,8 +3576,7 @@ PHP_FUNCTION(openssl_csr_new) if (we_made_the_key) { /* and a resource for the private key */ - zval_dtor(out_pkey); - ZVAL_RES(out_pkey, zend_register_resource(req.priv_key, le_key)); + ZEND_TRY_ASSIGN_RES(out_pkey, zend_register_resource(req.priv_key, le_key)); req.priv_key = NULL; /* make sure the cleanup code doesn't zap it! */ } else if (key_resource != NULL) { req.priv_key = NULL; /* make sure the cleanup code doesn't zap it! */ @@ -4585,7 +4587,7 @@ PHP_FUNCTION(openssl_pkey_export) BIO * bio_out = NULL; const EVP_CIPHER * cipher; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz/|s!a!", &zpkey, &out, &passphrase, &passphrase_len, &args) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz|s!a!", &zpkey, &out, &passphrase, &passphrase_len, &args) == FAILURE) { return; } RETVAL_FALSE; @@ -4637,8 +4639,7 @@ PHP_FUNCTION(openssl_pkey_export) RETVAL_TRUE; bio_mem_len = BIO_get_mem_data(bio_out, &bio_mem_ptr); - zval_dtor(out); - ZVAL_STRINGL(out, bio_mem_ptr, bio_mem_len); + ZEND_TRY_ASSIGN_STRINGL(out, bio_mem_ptr, bio_mem_len); } else { php_openssl_store_errors(); } @@ -5341,7 +5342,7 @@ PHP_FUNCTION(openssl_pkcs7_read) PKCS7 * p7 = NULL; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/", &p7b, &p7b_len, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "st", &p7b, &p7b_len, &zout) == FAILURE) { return; } @@ -5638,7 +5639,7 @@ PHP_FUNCTION(openssl_private_encrypt) size_t data_len; zend_long padding = RSA_PKCS1_PADDING; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { return; } RETVAL_FALSE; @@ -5669,9 +5670,8 @@ PHP_FUNCTION(openssl_private_encrypt) } if (successful) { - zval_dtor(crypted); ZSTR_VAL(cryptedbuf)[cryptedlen] = '\0'; - ZVAL_NEW_STR(crypted, cryptedbuf); + ZEND_TRY_ASSIGN_NEW_STR(crypted, cryptedbuf); cryptedbuf = NULL; RETVAL_TRUE; } else { @@ -5701,7 +5701,7 @@ PHP_FUNCTION(openssl_private_decrypt) char * data; size_t data_len; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { return; } RETVAL_FALSE; @@ -5738,9 +5738,8 @@ PHP_FUNCTION(openssl_private_decrypt) efree(crypttemp); if (successful) { - zval_dtor(crypted); ZSTR_VAL(cryptedbuf)[cryptedlen] = '\0'; - ZVAL_NEW_STR(crypted, cryptedbuf); + ZEND_TRY_ASSIGN_NEW_STR(crypted, cryptedbuf); cryptedbuf = NULL; RETVAL_TRUE; } else { @@ -5770,7 +5769,7 @@ PHP_FUNCTION(openssl_public_encrypt) char * data; size_t data_len; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) return; RETVAL_FALSE; @@ -5800,9 +5799,8 @@ PHP_FUNCTION(openssl_public_encrypt) } if (successful) { - zval_dtor(crypted); ZSTR_VAL(cryptedbuf)[cryptedlen] = '\0'; - ZVAL_NEW_STR(crypted, cryptedbuf); + ZEND_TRY_ASSIGN_NEW_STR(crypted, cryptedbuf); cryptedbuf = NULL; RETVAL_TRUE; } else { @@ -5832,7 +5830,7 @@ PHP_FUNCTION(openssl_public_decrypt) char * data; size_t data_len; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { return; } RETVAL_FALSE; @@ -5871,9 +5869,8 @@ PHP_FUNCTION(openssl_public_decrypt) efree(crypttemp); if (successful) { - zval_dtor(crypted); ZSTR_VAL(cryptedbuf)[cryptedlen] = '\0'; - ZVAL_NEW_STR(crypted, cryptedbuf); + ZEND_TRY_ASSIGN_NEW_STR(crypted, cryptedbuf); cryptedbuf = NULL; RETVAL_TRUE; } else { @@ -5934,7 +5931,7 @@ PHP_FUNCTION(openssl_sign) zend_long signature_algo = OPENSSL_ALGO_SHA1; const EVP_MD *mdtype; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z|z", &data, &data_len, &signature, &key, &method) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|z", &data, &data_len, &signature, &key, &method) == FAILURE) { return; } pkey = php_openssl_evp_from_zval(key, 0, "", 0, 0, &keyresource); @@ -5967,10 +5964,9 @@ PHP_FUNCTION(openssl_sign) EVP_SignInit(md_ctx, mdtype) && EVP_SignUpdate(md_ctx, data, data_len) && EVP_SignFinal(md_ctx, (unsigned char*)ZSTR_VAL(sigbuf), &siglen, pkey)) { - zval_dtor(signature); ZSTR_VAL(sigbuf)[siglen] = '\0'; ZSTR_LEN(sigbuf) = siglen; - ZVAL_NEW_STR(signature, sigbuf); + ZEND_TRY_ASSIGN_NEW_STR(signature, sigbuf); RETVAL_TRUE; } else { php_openssl_store_errors(); @@ -6062,7 +6058,7 @@ PHP_FUNCTION(openssl_seal) const EVP_CIPHER *cipher; EVP_CIPHER_CTX *ctx; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z/a|sz/", &data, &data_len, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szta|sz", &data, &data_len, &sealdata, &ekeys, &pubkeys, &method, &method_len, &iv) == FAILURE) { return; } @@ -6136,8 +6132,7 @@ PHP_FUNCTION(openssl_seal) } if (len1 + len2 > 0) { - zval_dtor(sealdata); - ZVAL_NEW_STR(sealdata, zend_string_init((char*)buf, len1 + len2, 0)); + ZEND_TRY_ASSIGN_NEW_STR(sealdata, zend_string_init((char*)buf, len1 + len2, 0)); efree(buf); zval_dtor(ekeys); @@ -6150,9 +6145,8 @@ PHP_FUNCTION(openssl_seal) } if (iv) { - zval_dtor(iv); iv_buf[iv_len] = '\0'; - ZVAL_NEW_STR(iv, zend_string_init((char*)iv_buf, iv_len, 0)); + ZEND_TRY_ASSIGN_NEW_STR(iv, zend_string_init((char*)iv_buf, iv_len, 0)); } } else { efree(buf); @@ -6194,7 +6188,7 @@ PHP_FUNCTION(openssl_open) size_t method_len = 0, iv_len = 0; const EVP_CIPHER *cipher; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/sz|ss", &data, &data_len, &opendata, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szsz|ss", &data, &data_len, &opendata, &ekey, &ekey_len, &privkey, &method, &method_len, &iv, &iv_len) == FAILURE) { return; } @@ -6240,9 +6234,8 @@ PHP_FUNCTION(openssl_open) if (ctx != NULL && EVP_OpenInit(ctx, cipher, (unsigned char *)ekey, (int)ekey_len, iv_buf, pkey) && EVP_OpenUpdate(ctx, buf, &len1, (unsigned char *)data, (int)data_len) && EVP_OpenFinal(ctx, buf + len1, &len2) && (len1 + len2 > 0)) { - zval_dtor(opendata); buf[len1 + len2] = '\0'; - ZVAL_NEW_STR(opendata, zend_string_init((char*)buf, len1 + len2, 0)); + ZEND_TRY_ASSIGN_NEW_STR(opendata, zend_string_init((char*)buf, len1 + len2, 0)); RETVAL_TRUE; } else { php_openssl_store_errors(); @@ -6594,7 +6587,7 @@ PHP_FUNCTION(openssl_encrypt) zend_string *outbuf; zend_bool free_iv = 0, free_password = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss|lsz/sl", &data, &data_len, &method, &method_len, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss|lszsl", &data, &data_len, &method, &method_len, &password, &password_len, &options, &iv, &iv_len, &tag, &aad, &aad_len, &tag_len) == FAILURE) { return; } @@ -6641,10 +6634,9 @@ PHP_FUNCTION(openssl_encrypt) zend_string *tag_str = zend_string_alloc(tag_len, 0); if (EVP_CIPHER_CTX_ctrl(cipher_ctx, mode.aead_get_tag_flag, tag_len, ZSTR_VAL(tag_str)) == 1) { - zval_dtor(tag); ZSTR_VAL(tag_str)[tag_len] = '\0'; ZSTR_LEN(tag_str) = tag_len; - ZVAL_NEW_STR(tag, tag_str); + ZEND_TRY_ASSIGN_NEW_STR(tag, tag_str); } else { php_error_docref(NULL, E_WARNING, "Retrieving verification tag failed"); zend_string_release_ex(tag_str, 0); @@ -6652,8 +6644,7 @@ PHP_FUNCTION(openssl_encrypt) RETVAL_FALSE; } } else if (tag) { - zval_dtor(tag); - ZVAL_NULL(tag); + ZEND_TRY_ASSIGN_NULL(tag); php_error_docref(NULL, E_WARNING, "The authenticated tag cannot be provided for cipher that doesn not support AEAD"); } else if (mode.is_aead) { @@ -6800,13 +6791,12 @@ PHP_FUNCTION(openssl_random_pseudo_bytes) zend_string *buffer = NULL; zval *zstrong_result_returned = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|z/", &buffer_length, &zstrong_result_returned) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|z", &buffer_length, &zstrong_result_returned) == FAILURE) { return; } if (zstrong_result_returned) { - zval_dtor(zstrong_result_returned); - ZVAL_FALSE(zstrong_result_returned); + ZEND_TRY_ASSIGN_FALSE(zstrong_result_returned); } if (buffer_length <= 0 @@ -6823,7 +6813,7 @@ PHP_FUNCTION(openssl_random_pseudo_bytes) if (php_win32_get_random_bytes((unsigned char*)buffer->val, (size_t) buffer_length) == FAILURE){ zend_string_release_ex(buffer, 0); if (zstrong_result_returned) { - ZVAL_FALSE(zstrong_result_returned); + ZEND_TRY_ASSIGN_FALSE(zstrong_result_returned); } RETURN_FALSE; } @@ -6835,7 +6825,7 @@ PHP_FUNCTION(openssl_random_pseudo_bytes) if (RAND_bytes((unsigned char*)ZSTR_VAL(buffer), (int)buffer_length) <= 0) { zend_string_release_ex(buffer, 0); if (zstrong_result_returned) { - ZVAL_FALSE(zstrong_result_returned); + ZEND_TRY_ASSIGN_FALSE(zstrong_result_returned); } RETURN_FALSE; } else { @@ -6847,7 +6837,7 @@ PHP_FUNCTION(openssl_random_pseudo_bytes) RETVAL_NEW_STR(buffer); if (zstrong_result_returned) { - ZVAL_BOOL(zstrong_result_returned, 1); + ZEND_TRY_ASSIGN_TRUE(zstrong_result_returned); } } /* }}} */ diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 097a5dfcc255..360cef6bec0e 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -2806,7 +2806,7 @@ static void verify_soap_headers_array(HashTable *ht) } -/* {{{ proto mixed SoapClient::__call(string function_name, array arguments [, array options [, array input_headers [, array output_headers]]]) +/* {{{ proto mixed SoapClient::__call(string function_name, array arguments [, array options [, array input_headers [, array &output_headers]]]) Calls a SOAP function */ PHP_METHOD(SoapClient, __call) { @@ -2825,7 +2825,7 @@ PHP_METHOD(SoapClient, __call) zend_bool free_soap_headers = 0; zval *this_ptr; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sa|a!zz/", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sa|a!zt", &function, &function_len, &args, &options, &headers, &output_headers) == FAILURE) { return; } diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index fd1cca3c95d2..c3e1e64dab55 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -1692,7 +1692,7 @@ PHP_FUNCTION(socket_recv) int retval; zend_long len, flags; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/ll", &php_sock_res, &buf, &len, &flags) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rzll", &php_sock_res, &buf, &len, &flags) == FAILURE) { return; } @@ -1709,16 +1709,11 @@ PHP_FUNCTION(socket_recv) if ((retval = recv(php_sock->bsd_socket, ZSTR_VAL(recv_buf), len, flags)) < 1) { zend_string_efree(recv_buf); - - zval_ptr_dtor(buf); - ZVAL_NULL(buf); + ZEND_TRY_ASSIGN_NULL(buf); } else { ZSTR_LEN(recv_buf) = retval; ZSTR_VAL(recv_buf)[ZSTR_LEN(recv_buf)] = '\0'; - - /* Rebuild buffer zval */ - zval_ptr_dtor(buf); - ZVAL_NEW_STR(buf, recv_buf); + ZEND_TRY_ASSIGN_NEW_STR(buf, recv_buf); } if (retval == -1) { @@ -1777,7 +1772,7 @@ PHP_FUNCTION(socket_recvfrom) char *address; zend_string *recv_buf; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/llz/|z/", &arg1, &arg2, &arg3, &arg4, &arg5, &arg6) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rzllz|z", &arg1, &arg2, &arg3, &arg4, &arg5, &arg6) == FAILURE) { return; } @@ -1806,11 +1801,8 @@ PHP_FUNCTION(socket_recvfrom) ZSTR_LEN(recv_buf) = retval; ZSTR_VAL(recv_buf)[ZSTR_LEN(recv_buf)] = '\0'; - zval_ptr_dtor(arg2); - zval_ptr_dtor(arg5); - - ZVAL_NEW_STR(arg2, recv_buf); - ZVAL_STRING(arg5, s_un.sun_path); + ZEND_TRY_ASSIGN_NEW_STR(arg2, recv_buf); + ZEND_TRY_ASSIGN_STRING(arg5, s_un.sun_path); break; case AF_INET: @@ -1833,15 +1825,11 @@ PHP_FUNCTION(socket_recvfrom) ZSTR_LEN(recv_buf) = retval; ZSTR_VAL(recv_buf)[ZSTR_LEN(recv_buf)] = '\0'; - zval_ptr_dtor(arg2); - zval_ptr_dtor(arg5); - zval_ptr_dtor(arg6); - address = inet_ntoa(sin.sin_addr); - ZVAL_NEW_STR(arg2, recv_buf); - ZVAL_STRING(arg5, address ? address : "0.0.0.0"); - ZVAL_LONG(arg6, ntohs(sin.sin_port)); + ZEND_TRY_ASSIGN_NEW_STR(arg2, recv_buf); + ZEND_TRY_ASSIGN_STRING(arg5, address ? address : "0.0.0.0"); + ZEND_TRY_ASSIGN_LONG(arg6, ntohs(sin.sin_port)); break; #if HAVE_IPV6 case AF_INET6: @@ -1864,16 +1852,12 @@ PHP_FUNCTION(socket_recvfrom) ZSTR_LEN(recv_buf) = retval; ZSTR_VAL(recv_buf)[ZSTR_LEN(recv_buf)] = '\0'; - zval_ptr_dtor(arg2); - zval_ptr_dtor(arg5); - zval_ptr_dtor(arg6); - memset(addr6, 0, INET6_ADDRSTRLEN); inet_ntop(AF_INET6, &sin6.sin6_addr, addr6, INET6_ADDRSTRLEN); - ZVAL_NEW_STR(arg2, recv_buf); - ZVAL_STRING(arg5, addr6[0] ? addr6 : "::"); - ZVAL_LONG(arg6, ntohs(sin6.sin6_port)); + ZEND_TRY_ASSIGN_NEW_STR(arg2, recv_buf); + ZEND_TRY_ASSIGN_STRING(arg5, addr6[0] ? addr6 : "::"); + ZEND_TRY_ASSIGN_LONG(arg6, ntohs(sin6.sin6_port)); break; #endif default: @@ -2230,7 +2214,7 @@ PHP_FUNCTION(socket_create_pair) PHP_SOCKET fds_array[2]; zend_long domain, type, protocol; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "lllz/", &domain, &type, &protocol, &fds_array_zval) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "lllt", &domain, &type, &protocol, &fds_array_zval) == FAILURE) { return; } diff --git a/ext/standard/dns_win32.c b/ext/standard/dns_win32.c index 4bca7128a1bf..3e3930af57d8 100644 --- a/ext/standard/dns_win32.c +++ b/ext/standard/dns_win32.c @@ -50,7 +50,7 @@ PHP_FUNCTION(dns_get_mx) /* {{{ */ DNS_STATUS status; /* Return value of DnsQuery_A() function */ PDNS_RECORD pResult, pRec; /* Pointer to DNS_RECORD structure */ - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/|z/", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "st|t", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { return; } @@ -352,7 +352,7 @@ PHP_FUNCTION(dns_get_record) int type, type_to_fetch, first_query = 1, store_results = 1; zend_bool raw = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lz/!z/!b", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lt!t!b", &hostname, &hostname_len, &type_param, &authns, &addtl, &raw) == FAILURE) { return; } diff --git a/ext/sysvmsg/sysvmsg.c b/ext/sysvmsg/sysvmsg.c index 1382eaa11973..d8f2722b43bd 100644 --- a/ext/sysvmsg/sysvmsg.c +++ b/ext/sysvmsg/sysvmsg.c @@ -293,7 +293,7 @@ PHP_FUNCTION(msg_remove_queue) } /* }}} */ -/* {{{ proto mixed msg_receive(resource queue, int desiredmsgtype, int &msgtype, int maxsize, mixed message [, bool unserialize=true [, int flags=0 [, int errorcode]]]) +/* {{{ proto mixed msg_receive(resource queue, int desiredmsgtype, int &msgtype, int maxsize, mixed &message [, bool unserialize=true [, int flags=0 [, int &errorcode]]]) Send a message of type msgtype (must be > 0) to a message queue */ PHP_FUNCTION(msg_receive) { @@ -307,7 +307,7 @@ PHP_FUNCTION(msg_receive) RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz/lz/|blz/", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlzlz|blz", &queue, &desiredmsgtype, &out_msgtype, &maxsize, &out_message, &do_unserialize, &flags, &zerrcode) == FAILURE) { return; @@ -343,20 +343,12 @@ PHP_FUNCTION(msg_receive) result = msgrcv(mq->id, messagebuffer, maxsize, desiredmsgtype, realflags); - zval_dtor(out_msgtype); - zval_dtor(out_message); - ZVAL_LONG(out_msgtype, 0); - ZVAL_FALSE(out_message); - - if (zerrcode) { - ZVAL_DEREF(zerrcode); - zval_dtor(zerrcode); - ZVAL_LONG(zerrcode, 0); - } - if (result >= 0) { /* got it! */ - ZVAL_LONG(out_msgtype, messagebuffer->mtype); + ZEND_TRY_ASSIGN_LONG(out_msgtype, messagebuffer->mtype); + if (zerrcode) { + ZEND_TRY_ASSIGN_LONG(zerrcode, 0); + } RETVAL_TRUE; if (do_unserialize) { @@ -367,16 +359,21 @@ PHP_FUNCTION(msg_receive) PHP_VAR_UNSERIALIZE_INIT(var_hash); if (!php_var_unserialize(&tmp, &p, p + result, &var_hash)) { php_error_docref(NULL, E_WARNING, "message corrupted"); + ZEND_TRY_ASSIGN_FALSE(out_message); RETVAL_FALSE; } else { - ZVAL_COPY_VALUE(out_message, &tmp); + zend_try_assign(out_message, &tmp); } PHP_VAR_UNSERIALIZE_DESTROY(var_hash); } else { - ZVAL_STRINGL(out_message, messagebuffer->mtext, result); + ZEND_TRY_ASSIGN_STRINGL(out_message, messagebuffer->mtext, result); + } + } else { + ZEND_TRY_ASSIGN_LONG(out_msgtype, 0); + ZEND_TRY_ASSIGN_FALSE(out_message); + if (zerrcode) { + ZEND_TRY_ASSIGN_LONG(zerrcode, errno); } - } else if (zerrcode) { - ZVAL_LONG(zerrcode, errno); } efree(messagebuffer); } @@ -396,7 +393,7 @@ PHP_FUNCTION(msg_send) RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz|bbz/", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz|bbz", &queue, &msgtype, &message, &do_serialize, &blocking, &zerror) == FAILURE) { return; } @@ -462,8 +459,7 @@ PHP_FUNCTION(msg_send) if (result == -1) { php_error_docref(NULL, E_WARNING, "msgsnd failed: %s", strerror(errno)); if (zerror) { - zval_ptr_dtor(zerror); - ZVAL_LONG(zerror, errno); + ZEND_TRY_ASSIGN_LONG(zerror, errno); } } else { RETVAL_TRUE; diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c index 6fbb66ddc5c5..eb1b5bf86f9f 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -759,11 +759,9 @@ void decode_request_worker(char *xml_in, int xml_in_len, char *encoding_in, zval if (method_name_out) { method_name = XMLRPC_RequestGetMethodName(response); if (method_name) { - zval_ptr_dtor(method_name_out); - ZVAL_STRING(method_name_out, method_name); + ZEND_TRY_ASSIGN_STRING(method_name_out, method_name); } else { - zval_ptr_dtor(retval); - ZVAL_NULL(retval); + ZEND_TRY_ASSIGN_NULL(retval); } } } @@ -782,7 +780,7 @@ PHP_FUNCTION(xmlrpc_decode_request) zval *method; size_t xml_len, encoding_len = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/|s", &xml, &xml_len, &method, &encoding, &encoding_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz|s", &xml, &xml_len, &method, &encoding, &encoding_len) == FAILURE) { return; } From a3f60c09b143347b3b2f25a3a82555de82caae96 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 26 Jun 2018 22:22:34 +0200 Subject: [PATCH 269/369] Opcache handling fixes and improvements --- ext/opcache/Optimizer/sccp.c | 3 + ext/opcache/Optimizer/zend_dfg.c | 8 ++- ext/opcache/Optimizer/zend_inference.c | 77 ++++++++------------------ ext/opcache/Optimizer/zend_ssa.c | 17 +++++- 4 files changed, 49 insertions(+), 56 deletions(-) diff --git a/ext/opcache/Optimizer/sccp.c b/ext/opcache/Optimizer/sccp.c index 7d92fc51f766..d480e1f16f13 100644 --- a/ext/opcache/Optimizer/sccp.c +++ b/ext/opcache/Optimizer/sccp.c @@ -256,6 +256,9 @@ static zend_bool can_replace_op1( case ZEND_VERIFY_RETURN_TYPE: // TODO: This would require a non-local change ??? return 0; + case ZEND_OP_DATA: + return (opline - 1)->opcode != ZEND_ASSIGN_OBJ_REF && + (opline - 1)->opcode != ZEND_ASSIGN_STATIC_PROP_REF; default: if (ssa_op->op1_def != -1) { ZEND_ASSERT(0); diff --git a/ext/opcache/Optimizer/zend_dfg.c b/ext/opcache/Optimizer/zend_dfg.c index aca528b40438..d8e9c82b6b88 100644 --- a/ext/opcache/Optimizer/zend_dfg.c +++ b/ext/opcache/Optimizer/zend_dfg.c @@ -52,8 +52,14 @@ int zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, zend_dfg if (next < end && next->opcode == ZEND_OP_DATA) { if (next->op1_type & (IS_CV|IS_VAR|IS_TMP_VAR)) { var_num = EX_VAR_TO_NUM(next->op1.var); - if (!DFG_ISSET(def, set_size, j, var_num)) { + if (opline->opcode == ZEND_ASSIGN_OBJ_REF + || opline->opcode == ZEND_ASSIGN_STATIC_PROP_REF) { DFG_SET(use, set_size, j, var_num); + DFG_SET(def, set_size, j, var_num); + } else { + if (!DFG_ISSET(def, set_size, j, var_num)) { + DFG_SET(use, set_size, j, var_num); + } } } if (next->op2_type & (IS_CV|IS_VAR|IS_TMP_VAR)) { diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 99ff5ede6e46..bfb26301dfc7 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -1852,11 +1852,11 @@ static uint32_t get_ssa_alias_types(zend_ssa_alias_kind alias) { } } -#define UPDATE_SSA_TYPE_EX(_type, _var, _typed_ref) \ +#define UPDATE_SSA_TYPE(_type, _var) \ do { \ uint32_t __type = (_type); \ int __var = (_var); \ - if (!(_typed_ref) && (__type & MAY_BE_REF)) { \ + if (__type & MAY_BE_REF) { \ __type |= MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; \ } \ if (__var >= 0) { \ @@ -1886,10 +1886,6 @@ static uint32_t get_ssa_alias_types(zend_ssa_alias_kind alias) { } \ } while (0) -#define UPDATE_SSA_TYPE(_type, _var) \ - UPDATE_SSA_TYPE_EX(_type, _var, 0) - - #define UPDATE_SSA_OBJ_TYPE(_ce, _is_instanceof, var) \ do { \ if (var >= 0) { \ @@ -2289,7 +2285,7 @@ static uint32_t zend_fetch_arg_info(const zend_script *script, zend_arg_info *ar return tmp; } -static uint32_t zend_fetch_prop_info(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, int i, zend_class_entry **pce) +static uint32_t zend_fetch_prop_type_info(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, int i, zend_class_entry **pce) { zend_property_info *prop_info = NULL; @@ -2302,12 +2298,15 @@ static uint32_t zend_fetch_prop_info(const zend_op_array *op_array, zend_ssa *ss ce = ssa->var_info[ssa->ops[i].op1_use].ce; } if (ce) { - prop_info = zend_hash_find_ptr(&ce->properties_info, Z_STR_P(CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants))); + prop_info = zend_hash_find_ptr(&ce->properties_info, + Z_STR_P(CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants))); } } if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { - uint32_t type = MAY_BE_UNDEF | MAY_BE_REF | (ZEND_TYPE_IS_CLASS(prop_info->type) ? MAY_BE_OBJECT : zend_convert_type_code_to_may_be(ZEND_TYPE_CODE(prop_info->type))); + uint32_t type = ZEND_TYPE_IS_CLASS(prop_info->type) + ? MAY_BE_OBJECT + : zend_convert_type_code_to_may_be(ZEND_TYPE_CODE(prop_info->type)); if (ZEND_TYPE_ALLOW_NULL(prop_info->type)) { type |= MAY_BE_NULL; @@ -2324,7 +2323,7 @@ static uint32_t zend_fetch_prop_info(const zend_op_array *op_array, zend_ssa *ss if (pce) { *pce = NULL; } - return 0; + return MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_RC1 | MAY_BE_RCN; } static int zend_update_type_info(const zend_op_array *op_array, @@ -2522,11 +2521,7 @@ static int zend_update_type_info(const zend_op_array *op_array, tmp = 0; if (opline->extended_value == ZEND_ASSIGN_OBJ) { orig = t1; - t1 = zend_fetch_prop_info(op_array, ssa, opline, i, NULL); - if (!t1) { - tmp |= MAY_BE_REF; - t1 = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; - } + t1 = zend_fetch_prop_type_info(op_array, ssa, opline, i, NULL); t2 = OP1_DATA_INFO(); } else if (opline->extended_value == ZEND_ASSIGN_DIM) { if (t1 & MAY_BE_ARRAY_OF_REF) { @@ -2596,7 +2591,9 @@ static int zend_update_type_info(const zend_op_array *op_array, * anything else results in a null return value. */ tmp |= MAY_BE_NULL; } - t1 = zend_fetch_prop_info(op_array, ssa, opline, i, &ce); + + /* The return value must also satisfy the property type */ + t1 = zend_fetch_prop_type_info(op_array, ssa, opline, i, &ce); if (t1) { tmp &= t1; } @@ -2782,12 +2779,8 @@ static int zend_update_type_info(const zend_op_array *op_array, COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); } if (ssa_ops[i].result_def >= 0) { - // TODO: ??? - tmp = MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; - t1 = zend_fetch_prop_info(op_array, ssa, opline, i, &ce); - if (t1) { - tmp &= t1; - } + // TODO: If there is no __set we might do better + tmp = zend_fetch_prop_type_info(op_array, ssa, opline, i, &ce); UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); if (ce) { UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); @@ -2902,6 +2895,7 @@ static int zend_update_type_info(const zend_op_array *op_array, UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); } + t2 = OP1_DATA_INFO(); if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION)) { tmp = (MAY_BE_REF | MAY_BE_RCN | MAY_BE_RC1 | t2) & ~MAY_BE_UNDEF; @@ -2911,17 +2905,8 @@ static int zend_update_type_info(const zend_op_array *op_array, if (t2 & MAY_BE_UNDEF) { tmp |= MAY_BE_NULL; } - UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); if (ssa_ops[i].result_def >= 0) { - // TODO: ??? - t1 = zend_fetch_prop_info(op_array, ssa, opline, i, &ce); - if (t1) { - tmp &= t1; - } UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); - if (ce) { - UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); - } } if ((opline+1)->op1_type == IS_CV) { opline++; @@ -2931,14 +2916,6 @@ static int zend_update_type_info(const zend_op_array *op_array, tmp |= MAY_BE_NULL; } UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); - - tmp = OP1_INFO(); - if (tmp & (MAY_BE_ANY | MAY_BE_REF)) { - if (tmp & MAY_BE_RC1) { - tmp |= MAY_BE_RCN; - } - } - UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); } break; case ZEND_BIND_GLOBAL: @@ -3457,21 +3434,13 @@ static int zend_update_type_info(const zend_op_array *op_array, COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); } if (ssa_ops[i].result_def >= 0) { - tmp = zend_fetch_prop_info(op_array, ssa, opline, i, &ce); - if (tmp) { - UPDATE_SSA_TYPE_EX(tmp, ssa_ops[i].result_def, 1); - if (ce) { - UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); - } - } else { - tmp = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; - if (opline->opcode == ZEND_FETCH_OBJ_R || opline->opcode == ZEND_FETCH_OBJ_IS) { - /* can't be REF because of ZVAL_COPY_DEREF() usage */ - tmp |= MAY_BE_RC1 | MAY_BE_RCN; - } else { - tmp |= MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ERROR; - } - UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); + tmp = zend_fetch_prop_type_info(op_array, ssa, opline, i, &ce); + if (opline->opcode != ZEND_FETCH_OBJ_R && opline->opcode != ZEND_FETCH_OBJ_IS) { + tmp |= MAY_BE_REF | MAY_BE_ERROR; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); + if (ce) { + UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); } } break; diff --git a/ext/opcache/Optimizer/zend_ssa.c b/ext/opcache/Optimizer/zend_ssa.c index 04e398fb75d0..1b776bae78e3 100644 --- a/ext/opcache/Optimizer/zend_ssa.c +++ b/ext/opcache/Optimizer/zend_ssa.c @@ -629,7 +629,6 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags, break; case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: - case ZEND_ASSIGN_OBJ_REF: if (opline->op1_type == IS_CV) { ssa_ops[k].op1_def = ssa_vars_count; var[EX_VAR_TO_NUM(opline->op1.var)] = ssa_vars_count; @@ -643,6 +642,22 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags, //NEW_SSA_VAR(next->op1.var) } break; + case ZEND_ASSIGN_OBJ_REF: + if (opline->op1_type == IS_CV) { + ssa_ops[k].op1_def = ssa_vars_count; + var[EX_VAR_TO_NUM(opline->op1.var)] = ssa_vars_count; + ssa_vars_count++; + //NEW_SSA_VAR(opline->op1.var) + } + /* break missing intentionally */ + case ZEND_ASSIGN_STATIC_PROP: + if (next->op1_type == IS_CV) { + ssa_ops[k + 1].op1_def = ssa_vars_count; + var[EX_VAR_TO_NUM(next->op1.var)] = ssa_vars_count; + ssa_vars_count++; + //NEW_SSA_VAR(next->op1.var) + } + break; case ZEND_PRE_INC_OBJ: case ZEND_PRE_DEC_OBJ: case ZEND_POST_INC_OBJ: From 062de9d27e731433ed24a5373cc8d1a75fe2ee02 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 27 Jun 2018 22:28:06 +0200 Subject: [PATCH 270/369] Reduce ASSIGN_STATIC_PROP_REF specialization This operation should be very rare... At least drop the OP_DATA specialization. --- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 1178 ++++++--------------------------------- Zend/zend_vm_gen.php | 2 +- Zend/zend_vm_handlers.h | 1112 ++++++++++++++++++------------------ 4 files changed, 726 insertions(+), 1568 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index cf8ca438c608..7449531e43ff 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2738,7 +2738,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C ZEND_VM_NEXT_OPCODE_EX(1, 2); } -ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT|SRC, SPEC(OP_DATA=VAR|CV)) +ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT|SRC) { USE_OPLINE zend_free_op free_op_data; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 5f71475fba57..a1260ddb63e9 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5284,7 +5284,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -5295,85 +5295,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO 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) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &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(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - 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_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -5388,7 +5321,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -5396,7 +5329,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -5414,6 +5347,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO 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); } @@ -8762,7 +8696,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -8773,85 +8707,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO 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) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &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(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - 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_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -8866,7 +8733,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -8874,7 +8741,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -8892,6 +8759,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO 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); } @@ -9717,7 +9585,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -9728,85 +9596,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO 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) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &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(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - 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_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -9821,7 +9622,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -9829,7 +9630,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -9847,6 +9648,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO 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); } @@ -15271,7 +15073,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -15282,85 +15084,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM 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) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &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(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - 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_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -15375,7 +15110,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -15383,7 +15118,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -15401,6 +15136,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM 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); } @@ -17687,7 +17423,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -17698,18 +17434,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM 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) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -17724,7 +17460,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -17732,74 +17468,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - 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) { - - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); - - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &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(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { - - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -17817,6 +17486,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM 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); } @@ -18386,7 +18056,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -18397,85 +18067,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM 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) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &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(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - 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_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -18490,7 +18093,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -18498,7 +18101,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -18516,6 +18119,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM 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); } @@ -46627,7 +46231,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -46638,85 +46242,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV 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) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &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(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - 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_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -46731,7 +46268,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -46739,7 +46276,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -46757,6 +46294,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV 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); } @@ -52232,7 +51770,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -52243,85 +51781,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV 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) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &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(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - 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_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -52336,7 +51807,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -52344,7 +51815,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -52362,6 +51833,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV 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); } @@ -53825,7 +53297,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -53836,85 +53308,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV 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) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &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(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - 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_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -53929,7 +53334,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -53937,7 +53342,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -53955,6 +53360,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV 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); } @@ -62060,130 +61466,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_STATIC_PROP_REF_SPEC_CONST_CONST_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_LABEL, (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_LABEL, (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -63907,13 +63213,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CONST_CONST): VM_TRACE(ZEND_FAST_CONCAT_SPEC_CONST_CONST) @@ -64255,13 +63557,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR): VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR) @@ -64407,13 +63705,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED): VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED) @@ -65159,13 +64453,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST): VM_TRACE(ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST) @@ -65371,13 +64661,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR): VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR) @@ -65471,13 +64757,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED): VM_TRACE(ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) @@ -68453,13 +67735,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV) ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CV_CONST): VM_TRACE(ZEND_FAST_CONCAT_SPEC_CV_CONST) @@ -69029,13 +68307,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_REF_SPEC_CV_VAR) ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR): VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR) @@ -69257,13 +68531,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV) ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED): VM_TRACE(ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED) @@ -73368,130 +72638,30 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_HANDLER, ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_HANDLER, ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_HANDLER, ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_HANDLER, ZEND_NULL_HANDLER, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER, ZEND_NULL_HANDLER, @@ -74688,12 +73858,12 @@ void zend_vm_init(void) 3322 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 3347 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, 3472 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 3597 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 3722 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3747 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3772 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3797 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 4713 + 3597 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3622 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3647 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3672 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3697 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 4613 }; #if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) zend_opcode_handler_funcs = labels; @@ -74896,7 +74066,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 = 3823 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3723 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -74904,7 +74074,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 = 3848 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3748 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -74912,7 +74082,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 = 3873 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3773 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -74923,17 +74093,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 = 3898 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3798 | 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 = 3923 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3823 | 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 = 3948 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3848 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_MUL: @@ -74944,17 +74114,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 = 3973 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3873 | 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 = 3998 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3898 | 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 = 4023 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3923 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_EQUAL: @@ -74965,12 +74135,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 = 4048 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 3948 | 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 = 4123 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4023 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_NOT_EQUAL: @@ -74981,12 +74151,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 = 4198 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4098 | 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 = 4273 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4173 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_SMALLER: @@ -74994,12 +74164,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 = 4348 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4248 | 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 = 4423 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4323 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_IS_SMALLER_OR_EQUAL: @@ -75007,70 +74177,70 @@ 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 = 4498 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4398 | 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 = 4573 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4473 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_QM_ASSIGN: if (op1_info == MAY_BE_DOUBLE) { - spec = 4666 | SPEC_RULE_OP1; + spec = 4566 | SPEC_RULE_OP1; } else if (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)))) { - spec = 4671 | SPEC_RULE_OP1; + spec = 4571 | SPEC_RULE_OP1; } break; case ZEND_PRE_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4648 | SPEC_RULE_RETVAL; + spec = 4548 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 4650 | SPEC_RULE_RETVAL; + spec = 4550 | SPEC_RULE_RETVAL; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4652 | SPEC_RULE_RETVAL; + spec = 4552 | SPEC_RULE_RETVAL; } break; case ZEND_PRE_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4654 | SPEC_RULE_RETVAL; + spec = 4554 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 4656 | SPEC_RULE_RETVAL; + spec = 4556 | SPEC_RULE_RETVAL; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4658 | SPEC_RULE_RETVAL; + spec = 4558 | SPEC_RULE_RETVAL; } break; case ZEND_POST_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4660; + spec = 4560; } else if (op1_info == MAY_BE_LONG) { - spec = 4661; + spec = 4561; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4662; + spec = 4562; } break; case ZEND_POST_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4663; + spec = 4563; } else if (op1_info == MAY_BE_LONG) { - spec = 4664; + spec = 4564; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4665; + spec = 4565; } break; case ZEND_JMP: if (OP_JMP_ADDR(op, op->op1) > op) { - spec = 3822; + spec = 3722; } break; case ZEND_SEND_VAR_EX: if (op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4706 | SPEC_RULE_OP1; + spec = 4606 | 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 = 4711 | SPEC_RULE_RETVAL; + spec = 4611 | SPEC_RULE_RETVAL; } break; case ZEND_FETCH_DIM_R: @@ -75078,12 +74248,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 = 4676 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4576 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_SEND_VAR: if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4701 | SPEC_RULE_OP1; + spec = 4601 | SPEC_RULE_OP1; } break; case ZEND_BW_OR: diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index aec2d627742d..7146ad0b46cb 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -571,7 +571,7 @@ ); $op_data_get_zval_ptr_ptr = array( - "ANY" => "get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data, \\1)", + "ANY" => "get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, \\1 EXECUTE_DATA_CC)", "TMP" => "NULL", "VAR" => "_get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC)", "CONST" => "NULL", diff --git a/Zend/zend_vm_handlers.h b/Zend/zend_vm_handlers.h index 722171847006..ed2cdb9304ac 100644 --- a/Zend/zend_vm_handlers.h +++ b/Zend/zend_vm_handlers.h @@ -1833,565 +1833,553 @@ _(3588, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_TMP) \ _(3589, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_VAR) \ _(3591, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CV) \ - _(3599, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR) \ - _(3601, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV) \ - _(3609, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR) \ - _(3611, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV) \ - _(3614, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR) \ - _(3616, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV) \ - _(3624, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR) \ - _(3626, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV) \ - _(3634, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR) \ - _(3636, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV) \ - _(3639, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR) \ - _(3641, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV) \ - _(3649, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR) \ - _(3651, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV) \ - _(3659, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR) \ - _(3661, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV) \ - _(3664, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR) \ - _(3666, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV) \ - _(3699, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR) \ - _(3701, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV) \ - _(3709, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR) \ - _(3711, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV) \ - _(3714, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR) \ - _(3716, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV) \ - _(3722, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST) \ - _(3724, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR) \ - _(3725, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED) \ - _(3727, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(3729, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(3730, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(3732, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(3734, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(3735, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(3742, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST) \ - _(3744, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR) \ - _(3745, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED) \ - _(3747, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST) \ - _(3749, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR) \ - _(3750, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED) \ - _(3752, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(3754, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(3755, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(3757, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(3759, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(3760, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(3767, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST) \ - _(3769, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR) \ - _(3770, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED) \ - _(3772, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST) \ - _(3774, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR) \ - _(3775, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED) \ - _(3777, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(3779, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(3780, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(3782, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(3784, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(3785, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(3792, ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST) \ - _(3794, ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR) \ - _(3795, ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED) \ - _(3797, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST) \ - _(3799, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR) \ - _(3800, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED) \ - _(3802, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(3804, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(3805, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(3807, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(3809, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(3810, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(3817, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST) \ - _(3819, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR) \ - _(3820, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED) \ - _(3822, ZEND_JMP_FORWARD_SPEC) \ - _(3828, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3829, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3830, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3832, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3833, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3834, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3835, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3837, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3843, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3844, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3845, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3847, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3853, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3854, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3855, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3857, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3858, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3859, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3860, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3862, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3868, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3869, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3870, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3872, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3878, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3879, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3880, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3882, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3883, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3884, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3885, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3887, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3893, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3894, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3895, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3897, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3899, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3900, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3902, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3903, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3904, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3905, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3907, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3908, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3909, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3910, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3912, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3918, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3919, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3920, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3922, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3924, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3925, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3927, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3928, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3929, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3930, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3932, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3933, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3934, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3935, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3937, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3943, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3944, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3945, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3947, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3949, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3950, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3952, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3953, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3954, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3955, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3957, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3958, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3959, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3960, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3962, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3968, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3969, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3970, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3972, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3978, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3979, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3980, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3982, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3983, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3984, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3985, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3987, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3993, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3994, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3995, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3997, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(4003, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(4004, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4005, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4007, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4008, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(4009, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4010, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4012, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4018, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(4019, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4020, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4022, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4028, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4029, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4030, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4032, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4033, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4034, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4035, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4037, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4043, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4044, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4045, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4047, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4063, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4064, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4065, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4066, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4067, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4068, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4069, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4070, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4071, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4075, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4076, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4077, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4078, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4079, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4080, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4081, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4082, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4083, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4084, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4085, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4086, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4090, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4091, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4092, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4108, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4109, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4110, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4111, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4112, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4113, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4114, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4115, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4116, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4120, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4121, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4122, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4138, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4139, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4140, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4141, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4142, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4143, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4144, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4145, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4146, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4150, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4151, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4152, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4153, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4154, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4155, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4156, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4157, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4158, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4159, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4160, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4161, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4165, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4166, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4167, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4183, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4184, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4185, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4186, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4187, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4188, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4189, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4190, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4191, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4195, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4196, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4197, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4213, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4214, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4215, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4216, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4217, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4218, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4219, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4220, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4221, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4225, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4226, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4227, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4228, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4229, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4230, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4231, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4232, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4233, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4234, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4235, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4236, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4240, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4241, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4242, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4258, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4259, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4260, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4261, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4262, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4263, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4264, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4265, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4266, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4270, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4271, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4272, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4288, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4289, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4290, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4291, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4292, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4293, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4294, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4295, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4296, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4300, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4301, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4302, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4303, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4304, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4305, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4306, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4307, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4308, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4309, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4310, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4311, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4315, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4316, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4317, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4333, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4334, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4335, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4336, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4337, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4338, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4339, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4340, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4341, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4345, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4346, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4347, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4351, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4352, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4353, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4354, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4355, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4356, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4360, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4361, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4362, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4363, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4364, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4365, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4366, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4367, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4368, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4369, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4370, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4371, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4375, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4376, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4377, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4378, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4379, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4380, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4381, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4382, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4383, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4384, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4385, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4386, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4390, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4391, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4392, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4408, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4409, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4410, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4411, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4412, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4413, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4414, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4415, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4416, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4420, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4421, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4422, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4426, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4427, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4428, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4429, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4430, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4431, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4435, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4436, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4437, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4438, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4439, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4440, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4441, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4442, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4443, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4444, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4445, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4446, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4450, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4451, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4452, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4453, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4454, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4455, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4456, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4457, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4458, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4459, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4460, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4461, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4465, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4466, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4467, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4483, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4484, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4485, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4486, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4487, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4488, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4489, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4490, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4491, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4495, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4496, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4497, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4501, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4502, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4503, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4504, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4505, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4506, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4510, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4511, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4512, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4513, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4514, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4515, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4516, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4517, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4518, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4519, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4520, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4521, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4525, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4526, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4527, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4528, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4529, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4530, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4531, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4532, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4533, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4534, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4535, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4536, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4540, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4541, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4542, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4558, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4559, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4560, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4561, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4562, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4563, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4564, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4565, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4566, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4570, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4571, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4572, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4576, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4577, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4578, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4579, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4580, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4581, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4585, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4586, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4587, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4588, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4589, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4590, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4591, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4592, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4593, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4594, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4595, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4596, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4600, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4601, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4602, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4603, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4604, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4605, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4606, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4607, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4608, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4609, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4610, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4611, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4615, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4616, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4617, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4633, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4634, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4635, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4636, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4637, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4638, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4639, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4640, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4641, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4645, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4646, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4647, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4648, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4649, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ - _(4650, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4651, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ - _(4652, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4653, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ - _(4654, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4655, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ - _(4656, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4657, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ - _(4658, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4659, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ - _(4660, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ - _(4661, ZEND_POST_INC_LONG_SPEC_TMPVARCV) \ - _(4662, ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ - _(4663, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ - _(4664, ZEND_POST_DEC_LONG_SPEC_TMPVARCV) \ - _(4665, ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ - _(4666, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ - _(4667, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4668, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4670, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4671, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ - _(4672, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4673, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4675, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4677, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4678, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4680, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4681, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(4682, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4683, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4685, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4686, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(4687, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4688, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4690, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4696, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ - _(4697, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4698, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4700, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4703, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ - _(4705, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ - _(4708, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR) \ - _(4710, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV) \ - _(4711, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ - _(4712, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ - _(4712+1, ZEND_NULL) + _(3597, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST) \ + _(3599, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR) \ + _(3600, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED) \ + _(3602, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST) \ + _(3604, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR) \ + _(3605, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED) \ + _(3607, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST) \ + _(3609, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR) \ + _(3610, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED) \ + _(3617, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST) \ + _(3619, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR) \ + _(3620, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED) \ + _(3622, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3624, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3625, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3627, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3629, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3630, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3632, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3634, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3635, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3642, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST) \ + _(3644, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR) \ + _(3645, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3647, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3649, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3650, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3652, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3654, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3655, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3657, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3659, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3660, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3667, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST) \ + _(3669, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR) \ + _(3670, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3672, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3674, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3675, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3677, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3679, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3680, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3682, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3684, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3685, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3692, ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST) \ + _(3694, ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR) \ + _(3695, ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3697, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3699, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3700, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3702, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3704, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3705, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3707, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3709, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3710, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3717, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST) \ + _(3719, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR) \ + _(3720, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3722, ZEND_JMP_FORWARD_SPEC) \ + _(3728, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3729, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3730, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3732, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3733, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3734, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3735, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3737, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3743, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3744, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3745, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3747, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3753, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3754, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3755, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3757, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3758, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3759, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3760, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3762, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3768, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3769, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3770, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3772, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3778, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3779, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3780, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3782, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3783, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3784, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3785, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3787, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3793, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3794, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3795, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3797, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3799, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3800, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3802, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3803, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3804, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3805, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3807, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3808, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3809, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3810, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3812, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3818, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3819, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3820, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3822, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3824, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3825, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3827, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3828, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3829, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3830, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3832, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3833, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3834, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3835, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3837, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3843, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3844, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3845, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3847, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3849, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3850, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3852, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3853, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3854, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3855, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3857, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3858, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3859, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3860, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3862, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3868, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3869, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3870, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3872, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3878, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3879, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3880, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3882, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3883, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3884, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3885, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3887, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3893, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3894, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3895, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3897, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3903, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(3904, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3905, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3907, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3908, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(3909, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3910, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3912, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3918, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(3919, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3920, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3922, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3928, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3929, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3930, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3932, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3933, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3934, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3935, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3937, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3943, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3944, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3945, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3947, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3963, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3964, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3965, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3966, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3967, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3968, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3969, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3970, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3971, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3975, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3976, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3977, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3978, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3979, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3980, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3981, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3982, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3983, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3984, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3985, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3986, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3990, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3991, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3992, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4008, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4009, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4010, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4011, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4012, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4013, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4014, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4015, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4016, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4020, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4021, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4022, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4038, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4039, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4040, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4041, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4042, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4043, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4044, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4045, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4046, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4050, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4051, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4052, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4053, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4054, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4055, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4056, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4057, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4058, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4059, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4060, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4061, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4065, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4066, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4067, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4083, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4084, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4085, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4086, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4087, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4088, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4089, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4090, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4091, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4095, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4096, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4097, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4113, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4114, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4115, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4116, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4117, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4118, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4119, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4120, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4121, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4125, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4126, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4127, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4128, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4129, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4130, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4131, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4132, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4133, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4134, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4135, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4136, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4140, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4141, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4142, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4158, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4159, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4160, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4161, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4162, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4163, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4164, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4165, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4166, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4170, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4171, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4172, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4188, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4189, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4190, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4191, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4192, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4193, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4194, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4195, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4196, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4200, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4201, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4202, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4203, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4204, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4205, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4206, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4207, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4208, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4209, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4210, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4211, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4215, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4216, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4217, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4233, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4234, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4235, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4236, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4237, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4238, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4239, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4240, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4241, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4245, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4246, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4247, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4251, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4252, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4253, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4254, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4255, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4256, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4260, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4261, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4262, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4263, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4264, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4265, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4266, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4267, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4268, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4269, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4270, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4271, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4275, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4276, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4277, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4278, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4279, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4280, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4281, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4282, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4283, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4284, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4285, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4286, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4290, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4291, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4292, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4308, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4309, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4310, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4311, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4312, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4313, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4314, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4315, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4316, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4320, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4321, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4322, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4326, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4327, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4328, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4329, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4330, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4331, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4335, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4336, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4337, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4338, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4339, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4340, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4341, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4342, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4343, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4344, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4345, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4346, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4350, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4351, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4352, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4353, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4354, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4355, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4356, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4357, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4358, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4359, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4360, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4361, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4365, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4366, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4367, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4383, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4384, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4385, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4386, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4387, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4388, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4389, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4390, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4391, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4395, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4396, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4397, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4401, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4402, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4403, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4404, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4405, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4406, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4410, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4411, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4412, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4413, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4414, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4415, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4416, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4417, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4418, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4419, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4420, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4421, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4425, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4426, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4427, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4428, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4429, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4430, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4431, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4432, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4433, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4434, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4435, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4436, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4440, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4441, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4442, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4458, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4459, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4460, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4461, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4462, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4463, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4464, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4465, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4466, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4470, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4471, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4472, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4476, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4477, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4478, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4479, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4480, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4481, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4485, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4486, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4487, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4488, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4489, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4490, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4491, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4492, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4493, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4494, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4495, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4496, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4500, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4501, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4502, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4503, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4504, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4505, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4506, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4507, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4508, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4509, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4510, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4511, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4515, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4516, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4517, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4533, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4534, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4535, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4536, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4537, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4538, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4539, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4540, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4541, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4545, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4546, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4547, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4548, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4549, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ + _(4550, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4551, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ + _(4552, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4553, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ + _(4554, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4555, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ + _(4556, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4557, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ + _(4558, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4559, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ + _(4560, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ + _(4561, ZEND_POST_INC_LONG_SPEC_TMPVARCV) \ + _(4562, ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ + _(4563, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ + _(4564, ZEND_POST_DEC_LONG_SPEC_TMPVARCV) \ + _(4565, ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ + _(4566, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ + _(4567, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4568, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4570, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4571, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ + _(4572, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4573, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4575, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4577, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4578, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4580, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4581, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(4582, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4583, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4585, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4586, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(4587, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4588, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4590, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4596, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ + _(4597, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4598, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4600, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4603, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ + _(4605, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ + _(4608, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR) \ + _(4610, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV) \ + _(4611, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ + _(4612, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ + _(4612+1, ZEND_NULL) From c91ea1579279e74c8e1c0e86f276d4d05b6a77a2 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 27 Jun 2018 22:49:15 +0200 Subject: [PATCH 271/369] Accept BP type in get_static_property And move the initialization check in there, so it's automatically handled everywhere using this function. --- Zend/zend_API.c | 4 ++-- Zend/zend_execute.c | 12 +----------- Zend/zend_object_handlers.c | 30 +++++++++++++++++++++--------- Zend/zend_object_handlers.h | 2 +- ext/reflection/php_reflection.c | 5 +++-- 5 files changed, 28 insertions(+), 25 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 6f105f7f6f9a..40064abc8e2e 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -4110,7 +4110,7 @@ ZEND_API int zend_update_static_property(zend_class_entry *scope, const char *na zend_string *key = zend_string_init(name, name_length, 0); EG(fake_scope) = scope; - property = zend_std_get_static_property(scope, key, 0, &prop_info); + property = zend_std_get_static_property(scope, key, BP_VAR_W, &prop_info); EG(fake_scope) = old_scope; zend_string_efree(key); if (!property) { @@ -4237,7 +4237,7 @@ ZEND_API zval *zend_read_static_property(zend_class_entry *scope, const char *na zend_string *key = zend_string_init(name, name_length, 0); EG(fake_scope) = scope; - property = zend_std_get_static_property(scope, key, silent, &prop_info); + property = zend_std_get_static_property(scope, key, silent ? BP_VAR_IS : BP_VAR_R, &prop_info); EG(fake_scope) = old_scope; zend_string_efree(key); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 225d295931d0..81970706afc3 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2658,7 +2658,7 @@ static zend_never_inline int zend_fetch_static_property_address_ex(zval **retval } } - *retval = zend_std_get_static_property(ce, name, fetch_type == BP_VAR_IS, &property_info); + *retval = zend_std_get_static_property(ce, name, fetch_type, &property_info); if (UNEXPECTED(op1_type != IS_CONST)) { zend_tmp_string_release(tmp_name); @@ -2697,16 +2697,6 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } } - if ((fetch_type == BP_VAR_R || fetch_type == BP_VAR_RW) && UNEXPECTED(Z_TYPE_P(*retval) == IS_UNDEF) && UNEXPECTED(property_info->type != 0)) { - const char *class_name, *prop_name; - zend_unmangle_property_name_ex(property_info->name, &class_name, &prop_name, NULL); - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), - "Typed static property %s::$%s must not be accessed before initialization", - ZSTR_VAL(property_info->ce->name), - prop_name); - return FAILURE; - } - if (by_ref && UNEXPECTED(property_info) && Z_TYPE_P(*retval) != IS_REFERENCE) { zval *ref = *retval; if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(*retval) <= IS_NULL)) { diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 569878fea167..8662d292b6d1 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -1514,23 +1514,24 @@ static void zend_intenal_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_property_info **property_info) /* {{{ */ +ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, int type, zend_property_info **property_info_ptr) /* {{{ */ { zval *ret; - *property_info = zend_hash_find_ptr(&ce->properties_info, property_name); + zend_property_info *property_info = zend_hash_find_ptr(&ce->properties_info, property_name); + *property_info_ptr = property_info; - if (UNEXPECTED(*property_info == NULL)) { + 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 (UNEXPECTED(!zend_verify_property_access(property_info, ce))) { + if (type != BP_VAR_IS) { + zend_throw_error(NULL, "Cannot access %s property %s::$%s", zend_visibility_string(property_info->flags), ZSTR_VAL(ce->name), ZSTR_VAL(property_name)); } return NULL; } - if (UNEXPECTED(((*property_info)->flags & ZEND_ACC_STATIC) == 0)) { + if (UNEXPECTED((property_info->flags & ZEND_ACC_STATIC) == 0)) { goto undeclared_property; } @@ -1546,15 +1547,26 @@ ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *p zend_intenal_class_init_statics(ce); } else { undeclared_property: - if (!silent) { + if (type != BP_VAR_IS) { zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(property_name)); } return NULL; } } - ret = CE_STATIC_MEMBERS(ce) + (*property_info)->offset; + 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_exception_ex(zend_ce_type_error, + ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), + "Typed static property %s::$%s must not be accessed before initialization", + ZSTR_VAL(property_info->ce->name), + ZSTR_VAL(property_name)); + return NULL; + } + return ret; } /* }}} */ diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index 14a2fc524ce1..23b51b364b35 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -175,7 +175,7 @@ extern const ZEND_API zend_object_handlers std_object_handlers; ((fbc)->common.prototype ? (fbc)->common.prototype->common.scope : (fbc)->common.scope) 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, struct _zend_property_info **prop_info); +ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, int type, struct _zend_property_info **prop_info); 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); diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 7a2d84c3f636..b5cd5f07b780 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3927,7 +3927,7 @@ ZEND_METHOD(reflection_class, getStaticPropertyValue) if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) { return; } - prop = zend_std_get_static_property(ce, name, 1, &prop_info); + prop = zend_std_get_static_property(ce, name, BP_VAR_IS, &prop_info); if (!prop) { if (def_value) { ZVAL_COPY(return_value, def_value); @@ -3962,8 +3962,9 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) { return; } - variable_ptr = zend_std_get_static_property(ce, name, 1, &prop_info); + variable_ptr = zend_std_get_static_property(ce, name, BP_VAR_W, &prop_info); if (!variable_ptr) { + zend_clear_exception(); zend_throw_exception_ex(reflection_exception_ptr, 0, "Class %s does not have a property named %s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); return; From 50b1cf30e97c76c159cdd826b845c145be76d45a Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 28 Jun 2018 15:15:34 +0000 Subject: [PATCH 272/369] Prevent type violations via array auto-promotion --- .../typed_properties_083.phpt | 72 +++ Zend/zend_compile.c | 55 ++- Zend/zend_compile.h | 3 +- Zend/zend_execute.c | 50 +- Zend/zend_vm_def.h | 21 +- Zend/zend_vm_execute.h | 452 ++++++++++++++---- Zend/zend_vm_gen.php | 2 + Zend/zend_vm_opcodes.c | 4 +- Zend/zend_vm_opcodes.h | 1 + ext/opcache/Optimizer/compact_literals.c | 14 +- ext/opcache/Optimizer/zend_optimizer.c | 6 +- 11 files changed, 537 insertions(+), 143 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_083.phpt 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 000000000000..bcf304404486 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_083.phpt @@ -0,0 +1,72 @@ +--TEST-- +Test array promotion does not violate type restrictions +--FILE-- +i[] = 1; +var_dump($a->i); + +try { + $a->p[] = "test"; +} catch (TypeError $e) { var_dump($e->getMessage()); } +try { // must be uninit + var_dump($a->p); +} catch (TypeError $e) { var_dump($e->getMessage()); } + +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 (TypeError $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 write an array to a null property which does not allow for array" +string(65) "Typed property Foo::$p must not be accessed before initialization" +array(1) { + ["bar"]=> + int(2) +} +string(71) "Cannot write an array to a null property which does not allow for array" +string(72) "Typed static property Foo::$s must not be accessed before initialization" +array(1) { + [0]=> + int(3) +} +string(81) "Cannot write an array to a null or false reference which does not allow for array" +NULL +string(81) "Cannot write an array to a null or false reference which does not allow for array" +NULL diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index c537afec78a1..6c77eccfb2ce 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2612,7 +2612,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); @@ -2620,9 +2620,11 @@ static void zend_compile_simple_var(znode *result, zend_ast *ast, uint32_t type, opline->result_type = IS_TMP_VAR; result->op_type = IS_TMP_VAR; } + return opline; } else if (zend_try_compile_cv(result, ast) == FAILURE) { - zend_compile_simple_var_no_cv(result, ast, type, delayed); + return zend_compile_simple_var_no_cv(result, ast, type, delayed); } + return NULL; } /* }}} */ @@ -2640,7 +2642,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_bool by_ref); +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) /* {{{ */ @@ -2661,7 +2663,11 @@ static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t znode var_node, dim_node; - zend_delayed_compile_var(&var_node, var_ast, type, 0); + 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) { @@ -2679,6 +2685,7 @@ static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t opline = zend_delayed_emit_op(result, ZEND_FETCH_DIM_R, &var_node, &dim_node); zend_adjust_for_fetch_type(opline, result, type); + return opline; } /* }}} */ @@ -8496,35 +8503,31 @@ void zend_compile_expr(znode *result, zend_ast *ast) /* {{{ */ } /* }}} */ -void zend_compile_var(znode *result, zend_ast *ast, uint32_t type, int by_ref) /* {{{ */ +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, by_ref); - return; + return zend_compile_prop(result, ast, type, by_ref); case ZEND_AST_STATIC_PROP: - zend_compile_static_prop(result, ast, type, by_ref, 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, @@ -8532,34 +8535,30 @@ void zend_compile_var(znode *result, zend_ast *ast, uint32_t type, int by_ref) / } zend_compile_expr(result, ast); - return; + return NULL; } } /* }}} */ -void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, zend_bool by_ref) /* {{{ */ +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_op *opline = zend_delayed_compile_prop(result, ast, type); if (by_ref) { opline->extended_value |= ZEND_FETCH_REF; } - return; + return opline; } case ZEND_AST_STATIC_PROP: - zend_compile_static_prop(result, ast, type, by_ref, 1); - return; + return zend_compile_static_prop(result, ast, type, by_ref, 1); default: - zend_compile_var(result, ast, type, 0); - return; + return zend_compile_var(result, ast, type, 0); } } /* }}} */ diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 5ca95e3f18a6..1c6a7bf831e9 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -133,7 +133,7 @@ typedef union _zend_parser_stack_elem { void zend_compile_top_stmt(zend_ast *ast); void zend_compile_stmt(zend_ast *ast); void zend_compile_expr(znode *node, zend_ast *ast); -void zend_compile_var(znode *node, zend_ast *ast, uint32_t type, int by_ref); +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); @@ -879,6 +879,7 @@ void zend_assert_valid_class_name(const zend_string *const_name); #define ZEND_FETCH_TYPE_MASK 0xe #define ZEND_FETCH_REF (1<<0) +#define ZEND_FETCH_DIM_WRITE (1<<1) #define ZEND_ISEMPTY (1<<0) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 81970706afc3..231b3c1019be 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2127,7 +2127,7 @@ static zend_never_inline zval* ZEND_FASTCALL zend_fetch_dimension_address_inner_ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *container, zval *dim, int dim_type, int type EXECUTE_DATA_DC) { - zval *retval; + zval *retval, *orig_container = container; if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { try_array: @@ -2208,8 +2208,13 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * } if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) { if (type != BP_VAR_UNSET) { - array_init(container); - goto fetch_from_array; + if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_container), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_container)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_container)), + "Cannot write an array to a null or false reference which does not allow for array"); + } else { + array_init(container); + goto fetch_from_array; + } } else { /* for read-mode only */ ZVAL_NULL(result); @@ -2507,7 +2512,7 @@ static zend_never_inline int ZEND_FASTCALL zend_isempty_dim_slow(zval *container } } -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 by_ref OPLINE_DC) +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 OPLINE_DC) { zval *ptr; @@ -2538,9 +2543,10 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (EXPECTED(Z_TYPE_P(ptr) != IS_UNDEF)) { return_indirect: ZVAL_INDIRECT(result, ptr); - if (by_ref + if (flags && (prop_op_type == IS_CONST || EXPECTED(Z_TYPE_P(prop_ptr) == IS_STRING)) - && Z_TYPE_P(ptr) != IS_REFERENCE) { + && (((flags & ZEND_FETCH_REF) && Z_TYPE_P(ptr) != IS_REFERENCE) + || ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(ptr) <= IS_FALSE || (Z_ISREF_P(ptr) && Z_TYPE_P(Z_REFVAL_P(ptr)) == IS_NULL))))) { zend_property_info *prop_info; if (prop_op_type == IS_CONST) { @@ -2549,6 +2555,15 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(prop_ptr), NULL); } if (UNEXPECTED(prop_info)) { + if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(ptr) <= IS_FALSE || (Z_ISREF_P(ptr) && Z_TYPE_P(Z_REFVAL_P(ptr)) == IS_NULL))) { + if (!zend_verify_ref_type_assignable(prop_info->type, IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), + "Cannot write an array to a null property which does not allow for array"); + ZVAL_UNDEF(ptr); + ZVAL_ERROR(result); + } + return; + } if (!ZEND_TYPE_ALLOW_NULL(prop_info->type) && Z_TYPE_P(ptr) == IS_NULL) { zend_throw_error(NULL, "Cannot access uninitialized non-nullable property by reference"); ZVAL_UNDEF(ptr); @@ -2683,7 +2698,7 @@ static zend_never_inline int zend_fetch_static_property_address_ex(zval **retval } -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 by_ref OPLINE_DC EXECUTE_DATA_DC) { +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; @@ -2697,15 +2712,22 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } } - if (by_ref && UNEXPECTED(property_info) && Z_TYPE_P(*retval) != IS_REFERENCE) { - zval *ref = *retval; - if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(*retval) <= IS_NULL)) { - zend_throw_error(NULL, "Cannot access uninitialized property by reference"); + if (flags && UNEXPECTED(property_info)) { + if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(*retval) <= IS_FALSE || (Z_ISREF_P(*retval) && Z_TYPE_P(Z_REFVAL_P(*retval)) == IS_NULL)) && !zend_verify_ref_type_assignable(property_info->type, IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), + "Cannot write an array to a null property which does not allow for array"); return FAILURE; } - ZVAL_NEW_REF(ref, ref); - Z_REFTYPE_P(ref) = zend_get_prop_info_ref_type(property_info); - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ref), property_info); + if ((flags & ZEND_FETCH_REF) && Z_TYPE_P(*retval) != IS_REFERENCE) { + zval *ref = *retval; + if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(*retval) <= IS_NULL)) { + zend_throw_error(NULL, "Cannot access uninitialized property by reference"); + return FAILURE; + } + ZVAL_NEW_REF(ref, ref); + Z_REFTYPE_P(ref) = zend_get_prop_info_ref_type(property_info); + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ref), property_info); + } } if (prop_info) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7449531e43ff..8096a3d8546b 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1762,7 +1762,7 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -1785,7 +1785,7 @@ ZEND_VM_HANDLER(173, ZEND_FETCH_STATIC_PROP_R, CONST|TMPVAR|CV, UNUSED|CLASS_FET ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_R); } -ZEND_VM_HANDLER(174, ZEND_FETCH_STATIC_PROP_W, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, FETCH_REF|CACHE_SLOT) +ZEND_VM_HANDLER(174, ZEND_FETCH_STATIC_PROP_W, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, FETCH_REF|DIM_WRITE|CACHE_SLOT) { ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_W); } @@ -2056,7 +2056,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|CACHE_SLOT) +ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|DIM_WRITE|CACHE_SLOT) { USE_OPLINE zend_free_op free_op1, free_op2; @@ -2071,7 +2071,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH 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 & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); + zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); FREE_OP2(); if (OP1_TYPE == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -2466,14 +2466,14 @@ ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC( { 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): @@ -2528,6 +2528,15 @@ ZEND_VM_C_LABEL(try_assign_dim_array): FREE_OP_DATA(); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + FREE_UNFETCHED_OP2(); + FREE_UNFETCHED_OP_DATA(); + FREE_OP1_VAR_PTR(); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); ZEND_VM_C_GOTO(try_assign_dim_array); } else { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a1260ddb63e9..b22252397e7b 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4738,7 +4738,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -8437,7 +8437,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -9311,7 +9311,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -14568,7 +14568,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -17164,7 +17164,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -17797,7 +17797,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -25060,7 +25060,7 @@ 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 & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); + zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -25717,14 +25717,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; 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: @@ -25778,6 +25778,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -25804,14 +25813,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -25866,6 +25875,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -25892,14 +25910,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -25954,6 +25972,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -25980,14 +26007,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; 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: @@ -26041,6 +26068,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -27881,7 +27917,7 @@ 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 & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF 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_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -28539,14 +28575,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2; 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: @@ -28600,6 +28636,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -28626,14 +28671,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -28688,6 +28733,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -28714,14 +28768,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -28776,6 +28830,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -28802,14 +28865,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2; 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: @@ -28863,6 +28926,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -30410,14 +30482,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; 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: @@ -30471,6 +30543,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -30497,14 +30578,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -30559,6 +30640,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -30585,14 +30675,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -30647,6 +30737,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -30673,14 +30772,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; 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: @@ -30734,6 +30833,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -32167,7 +32275,7 @@ 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 & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); + zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -32824,14 +32932,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; 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: @@ -32885,6 +32993,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -32911,14 +33028,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -32973,6 +33090,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -32999,14 +33125,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -33061,6 +33187,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -33087,14 +33222,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; 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: @@ -33148,6 +33283,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -34750,7 +34894,7 @@ 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 & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); + zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -36824,7 +36968,7 @@ 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 & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF 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_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -39524,7 +39668,7 @@ 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 & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); + zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -44366,7 +44510,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -44650,7 +44794,7 @@ 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 & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); + zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -45609,14 +45753,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -45670,6 +45814,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -45696,14 +45849,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -45758,6 +45911,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -45784,14 +45946,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -45846,6 +46008,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -45872,14 +46043,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -45933,6 +46104,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -49149,7 +49329,7 @@ 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 & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF 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_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -49902,14 +50082,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -49963,6 +50143,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -49989,14 +50178,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -50051,6 +50240,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -50077,14 +50275,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -50139,6 +50337,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -50165,14 +50372,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -50226,6 +50433,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -51406,7 +51622,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -52639,7 +52855,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -52951,14 +53167,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -53012,6 +53228,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -53038,14 +53263,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -53100,6 +53325,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -53126,14 +53360,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -53188,6 +53422,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -53214,14 +53457,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -53275,6 +53518,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -55667,7 +55919,7 @@ 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 & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); + zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -56418,14 +56670,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -56479,6 +56731,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -56505,14 +56766,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -56567,6 +56828,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -56593,14 +56863,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -56655,6 +56925,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -56681,14 +56960,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -56742,6 +57021,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index 7146ad0b46cb..69f694232f3e 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -78,6 +78,7 @@ "ZEND_VM_EXT_ARRAY_INIT" => 1<<19, "ZEND_VM_EXT_REF" => 1<<20, "ZEND_VM_EXT_FETCH_REF" => 1<<21, + "ZEND_VM_EXT_DIM_WRITE" => 1<<19, "ZEND_VM_EXT_MASK" => 0x0f000000, "ZEND_VM_EXT_NUM" => 0x01000000, "ZEND_VM_EXT_LAST_CATCH" => 0x02000000, @@ -134,6 +135,7 @@ "FETCH_REF" => ZEND_VM_EXT_FETCH_REF, "SRC" => ZEND_VM_EXT_SRC, "CACHE_SLOT" => ZEND_VM_EXT_CACHE_SLOT, + "DIM_WRITE" => ZEND_VM_EXT_DIM_WRITE, ); $vm_kind_name = array( diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 19c8b2e9d70b..5f16bb67b6e1 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -317,7 +317,7 @@ static uint32_t zend_vm_opcodes_flags[206] = { 0x00040757, 0x00010107, 0x00006701, - 0x00240751, + 0x002c0751, 0x00010107, 0x00006701, 0x00040751, @@ -406,7 +406,7 @@ static uint32_t zend_vm_opcodes_flags[206] = { 0x03000000, 0x03000100, 0x00047307, - 0x00247307, + 0x002c7307, 0x00047307, 0x00047307, 0x00247307, diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index de2607e4cc2c..1a1eea813f87 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -54,6 +54,7 @@ #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_WRITE 0x00080000 #define ZEND_VM_EXT_MASK 0x0f000000 #define ZEND_VM_EXT_NUM 0x01000000 #define ZEND_VM_EXT_LAST_CATCH 0x02000000 diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index a16cd873925a..e68c0b8259b3 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -556,12 +556,12 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx // op2 property if (opline->op1_type == IS_UNUSED && property_slot[opline->op2.constant] >= 0) { - opline->extended_value = property_slot[opline->op2.constant] | (opline->extended_value & ZEND_FETCH_REF); + opline->extended_value = property_slot[opline->op2.constant] | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)); } else { - opline->extended_value = cache_size | (opline->extended_value & ZEND_FETCH_REF); + opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)); cache_size += 3 * sizeof(void *); if (opline->op1_type == IS_UNUSED) { - property_slot[opline->op2.constant] = opline->extended_value & ~ZEND_FETCH_REF; + property_slot[opline->op2.constant] = opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE); } } } @@ -686,17 +686,17 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx opline->op2.constant, opline->op1.constant, LITERAL_STATIC_PROPERTY, - &cache_size) | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + &cache_size) | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); } else { - opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); cache_size += 3 * sizeof(void *); } } else if (opline->op2_type == IS_CONST) { // op2 class if (class_slot[opline->op2.constant] >= 0) { - opline->extended_value = class_slot[opline->op2.constant] | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + opline->extended_value = class_slot[opline->op2.constant] | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); } else { - opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); class_slot[opline->op2.constant] = cache_size; cache_size += sizeof(void *); } diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 880bbc0ae0b7..4a308537c5e8 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -349,10 +349,10 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, case ZEND_POST_DEC_STATIC_PROP: TO_STRING_NOWARN(val); opline->op1.constant = zend_optimizer_add_literal(op_array, val); - if (opline->op2_type == IS_CONST && (opline->extended_value & ~(ZEND_FETCH_REF|ZEND_ISEMPTY)) + sizeof(void*) == op_array->cache_size) { + if (opline->op2_type == IS_CONST && (opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)) + sizeof(void*) == op_array->cache_size) { op_array->cache_size += sizeof(void *); } else { - opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); } break; case ZEND_SEND_VAR: @@ -445,7 +445,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, opline->op2.constant = zend_optimizer_add_literal(op_array, val); zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); if (opline->op1_type != IS_CONST) { - opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & (ZEND_RETURNS_FUNCTION | ZEND_FETCH_REF | ZEND_ISEMPTY)); + opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & (ZEND_RETURNS_FUNCTION|ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); } break; case ZEND_INIT_FCALL: From 4ce995d49ea992865161ebe3186a5db83eb002af Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 28 Jun 2018 18:35:18 +0000 Subject: [PATCH 273/369] Fix type check for array promotion check --- Zend/zend_execute.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index e9b6741b008f..6a2b55c61a45 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -75,6 +75,9 @@ static zend_always_inline zend_type zend_get_prop_info_ref_type(zend_property_in /* do not call when new_type == IS_REFERENCE or new_type == IS_OBJECT! */ static zend_always_inline zend_bool zend_verify_ref_type_assignable(zend_type type, zend_uchar new_type) { + if (!type) { + return 1; + } zend_uchar cur_type = ZEND_TYPE_CODE(type); return new_type == cur_type || (ZEND_TYPE_ALLOW_NULL(type) && new_type == IS_NULL) From 406d59469f6bf52e05824bc2ac44a2d1cb6c37d1 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 28 Jun 2018 23:58:58 +0200 Subject: [PATCH 274/369] Restore fast-path check for uninitialized static property It's not sufficient to check on the slow-path only, as opcache may combine cache entries. --- Zend/zend_execute.c | 14 +++++++++++++- ext/opcache/Optimizer/zend_ssa.c | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 231b3c1019be..b8e1544393bd 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2705,6 +2705,18 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, 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)) { + const char *class_name, *prop_name; + zend_unmangle_property_name_ex(property_info->name, &class_name, &prop_name, NULL); + zend_throw_exception_ex(zend_ce_type_error, + ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), + "Typed static property %s::$%s must not be accessed before initialization", + ZSTR_VAL(property_info->ce->name), + prop_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)) { @@ -2712,7 +2724,7 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } } - if (flags && UNEXPECTED(property_info)) { + if (flags) { if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(*retval) <= IS_FALSE || (Z_ISREF_P(*retval) && Z_TYPE_P(Z_REFVAL_P(*retval)) == IS_NULL)) && !zend_verify_ref_type_assignable(property_info->type, IS_ARRAY)) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), "Cannot write an array to a null property which does not allow for array"); diff --git a/ext/opcache/Optimizer/zend_ssa.c b/ext/opcache/Optimizer/zend_ssa.c index 1b776bae78e3..1c260a817150 100644 --- a/ext/opcache/Optimizer/zend_ssa.c +++ b/ext/opcache/Optimizer/zend_ssa.c @@ -650,7 +650,7 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags, //NEW_SSA_VAR(opline->op1.var) } /* break missing intentionally */ - case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_STATIC_PROP_REF: if (next->op1_type == IS_CV) { ssa_ops[k + 1].op1_def = ssa_vars_count; var[EX_VAR_TO_NUM(next->op1.var)] = ssa_vars_count; From 561f868f9cf2c910b3d327ca79eeba6efab6710c Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 30 Jun 2018 08:37:10 +0000 Subject: [PATCH 275/369] Add ReflectionProperty::isInitialized() --- ext/reflection/php_reflection.c | 61 +++++++++++++++++++ .../ReflectionProperty_isInitialized.phpt | 34 +++++++++++ 2 files changed, 95 insertions(+) create mode 100644 ext/reflection/tests/ReflectionProperty_isInitialized.phpt diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index f1f640e92fb1..66f33e11e8a3 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -5669,6 +5669,62 @@ ZEND_METHOD(reflection_property, setValue) } /* }}} */ +/* {{{ proto public mixed ReflectionProperty::isInitialized([stdclass object]) + Returns this property's value */ +ZEND_METHOD(reflection_property, isInitialized) +{ + reflection_object *intern; + property_reference *ref; + zval *object, *name; + zval *member_p = NULL; + + METHOD_NOTSTATIC(reflection_property_ptr); + GET_REFLECTION_OBJECT_PTR(ref); + + if (!(ref->prop.flags & (ZEND_ACC_PUBLIC | ZEND_ACC_IMPLICIT_PUBLIC)) && intern->ignore_visibility == 0) { + name = _default_load_name(getThis()); + zend_throw_exception_ex(reflection_exception_ptr, 0, + "Cannot access non-public member %s::%s", ZSTR_VAL(intern->ce->name), Z_STRVAL_P(name)); + return; + } + + if (ref->prop.flags & ZEND_ACC_IMPLICIT_PUBLIC) { + RETURN_TRUE; + } + + if (ref->prop.flags & ZEND_ACC_STATIC) { + zend_property_info *dummy; + zend_class_entry *old_scope = EG(fake_scope); + EG(fake_scope) = ref->ce; + member_p = zend_std_get_static_property(ref->ce, ref->unmangled_name, BP_VAR_IS, &dummy); + EG(fake_scope) = old_scope; + + if (member_p) { + ZVAL_DEREF(member_p); + RETURN_BOOL(!Z_ISUNDEF_P(member_p)) + } + RETURN_FALSE; + } else { + zval rv; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &object) == FAILURE) { + return; + } + + if (!instanceof_function(Z_OBJCE_P(object), ref->ce)) { + _DO_THROW("Given object is not an instance of the class this property was declared in"); + /* Returns from this function */ + } + + member_p = zend_read_property_ex(ref->ce, object, ref->unmangled_name, 1, &rv); + RETVAL_BOOL(member_p != &EG(uninitialized_zval)); + if (member_p == &rv) { + zval_ptr_dtor(member_p); + } + } +} +/* }}} */ + /* {{{ proto public ReflectionClass ReflectionProperty::getDeclaringClass() Get the declaring class */ ZEND_METHOD(reflection_property, getDeclaringClass) @@ -6621,6 +6677,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_reflection_property_setValue, 0, 0, 1) ZEND_ARG_INFO(0, value) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_reflection_property_isInitialized, 0, 0, 0) + ZEND_ARG_INFO(0, object) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO(arginfo_reflection_property_setAccessible, 0) ZEND_ARG_INFO(0, visible) ZEND_END_ARG_INFO() @@ -6633,6 +6693,7 @@ static const zend_function_entry reflection_property_functions[] = { ZEND_ME(reflection_property, getName, arginfo_reflection__void, 0) ZEND_ME(reflection_property, getValue, arginfo_reflection_property_getValue, 0) ZEND_ME(reflection_property, setValue, arginfo_reflection_property_setValue, 0) + ZEND_ME(reflection_property, isInitialized, arginfo_reflection_property_isInitialized, 0) ZEND_ME(reflection_property, isPublic, arginfo_reflection__void, 0) ZEND_ME(reflection_property, isPrivate, arginfo_reflection__void, 0) ZEND_ME(reflection_property, isProtected, arginfo_reflection__void, 0) diff --git a/ext/reflection/tests/ReflectionProperty_isInitialized.phpt b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt new file mode 100644 index 000000000000..a9aca7765fac --- /dev/null +++ b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt @@ -0,0 +1,34 @@ +--TEST-- +Test ReflectionProperty::isInitialized() +--FILE-- +isInitialized()); +var_dump((new ReflectionProperty(A::class, 'ss'))->isInitialized()); +var_dump((new ReflectionProperty(A::class, 's'))->isInitialized()); +$a = new A; +$a->d = null; +var_dump((new ReflectionProperty($a, 'iv'))->isInitialized($a)); +var_dump((new ReflectionProperty($a, 'i'))->isInitialized($a)); +var_dump((new ReflectionProperty($a, 'n'))->isInitialized($a)); +var_dump((new ReflectionProperty($a, 'd'))->isInitialized($a)); + +?> +--EXPECT-- +bool(true) +bool(false) +bool(true) +bool(true) +bool(false) +bool(true) +bool(true) + From 04aaea88b975d8a92395badfa8688007b99d17ff Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 30 Jun 2018 12:00:01 +0200 Subject: [PATCH 276/369] Minor cleanups --- Zend/zend_execute.c | 6 ++---- ext/reflection/php_reflection.c | 1 - 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 3398380378ce..b2e927b1a281 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1705,13 +1705,13 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ prop = Z_REFVAL_P(prop); } - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), prop); + ZVAL_COPY(EX_VAR(opline->result.var), prop); if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ zval z_copy; - ZVAL_DUP(&z_copy, prop); + ZVAL_COPY(&z_copy, prop); if (inc) { increment_function(&z_copy); } else { @@ -1727,10 +1727,8 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); } zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(prop); /* we copied by value into result.var */ } } else { - zval_opt_copy_ctor(prop); if (inc) { increment_function(prop); } else { diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index a72a87cb878c..1dff14756034 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -5675,7 +5675,6 @@ ZEND_METHOD(reflection_property, isInitialized) if (ref->prop.flags & ZEND_ACC_STATIC) { member_p = zend_read_static_property_ex(ref->ce, ref->unmangled_name, 1); if (member_p) { - ZVAL_DEREF(member_p); RETURN_BOOL(!Z_ISUNDEF_P(member_p)) } RETURN_FALSE; From e8dc5114b40a4f6fe9161a6498ae77aeb8da265a Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 1 Jul 2018 09:05:55 +0000 Subject: [PATCH 277/369] Fix refcount on std_write_property with coercion --- Zend/zend_object_handlers.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 8662d292b6d1..7ecec0bd3eb7 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -803,17 +803,21 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot); zval tmp, *val; + Z_TRY_ADDREF_P(value); + if (UNEXPECTED(prop_info)) { val = zend_verify_property_type(prop_info, value, &tmp, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(member), value); + Z_TRY_DELREF_P(value); value = &EG(error_zval); goto exit; } value = val; } + found: - zend_assign_to_variable(variable_ptr, value, IS_CV, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); + zend_assign_to_variable(variable_ptr, value, IS_VAR, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); goto exit; } } else if (EXPECTED(IS_DYNAMIC_PROPERTY_OFFSET(property_offset))) { @@ -825,6 +829,7 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, zobj->properties = zend_array_dup(zobj->properties); } if ((variable_ptr = zend_hash_find(zobj->properties, Z_STR_P(member))) != NULL) { + Z_TRY_ADDREF_P(value); goto found; } } From ef67defb72f7524dee24d2b658b3c1def525aaff Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 2 Jul 2018 18:16:31 +0200 Subject: [PATCH 278/369] Fix ReflectionProperty::isInitialized() for dynamic props A dynamic properties may exist at time of ReflectionProperty instantiation but be unset later, so we cannot short-circuit. --- ext/reflection/php_reflection.c | 4 --- .../ReflectionProperty_isInitialized.phpt | 29 +++++++++++++++++-- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 1dff14756034..2c3e6b5f91c8 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -5668,10 +5668,6 @@ ZEND_METHOD(reflection_property, isInitialized) return; } - if (ref->prop.flags & ZEND_ACC_IMPLICIT_PUBLIC) { - RETURN_TRUE; - } - if (ref->prop.flags & ZEND_ACC_STATIC) { member_p = zend_read_static_property_ex(ref->ce, ref->unmangled_name, 1); if (member_p) { diff --git a/ext/reflection/tests/ReflectionProperty_isInitialized.phpt b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt index a9aca7765fac..ce1b4bd45f81 100644 --- a/ext/reflection/tests/ReflectionProperty_isInitialized.phpt +++ b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt @@ -12,23 +12,46 @@ class A { public $n; } +echo "Static properties:\n"; var_dump((new ReflectionProperty(A::class, 'ssv'))->isInitialized()); var_dump((new ReflectionProperty(A::class, 'ss'))->isInitialized()); var_dump((new ReflectionProperty(A::class, 's'))->isInitialized()); + +echo "Declared properties:\n"; $a = new A; -$a->d = null; var_dump((new ReflectionProperty($a, 'iv'))->isInitialized($a)); var_dump((new ReflectionProperty($a, 'i'))->isInitialized($a)); var_dump((new ReflectionProperty($a, 'n'))->isInitialized($a)); -var_dump((new ReflectionProperty($a, 'd'))->isInitialized($a)); + +echo "Declared properties after unset:\n"; +unset($a->iv); +unset($a->i); +unset($a->n); +var_dump((new ReflectionProperty($a, 'i'))->isInitialized($a)); +var_dump((new ReflectionProperty($a, 'iv'))->isInitialized($a)); +var_dump((new ReflectionProperty($a, 'n'))->isInitialized($a)); + +echo "Dynamic properties:\n"; +$a->d = null; +$rp = new ReflectionProperty($a, 'd'); +var_dump($rp->isInitialized($a)); +unset($a->d); +var_dump($rp->isInitialized($a)); ?> --EXPECT-- +Static properties: bool(true) bool(false) bool(true) +Declared properties: bool(true) bool(false) bool(true) +Declared properties after unset: +bool(false) +bool(false) +bool(false) +Dynamic properties: bool(true) - +bool(false) From 050f6424ddd6539ec3ae7d2dc3b3cf0b43d85ea5 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 2 Jul 2018 18:40:24 +0200 Subject: [PATCH 279/369] Fix ReflectionProperty::setValue() on typed static property --- Zend/zend_API.c | 20 ++++++++------ .../ReflectionProperty_typed_static.phpt | 27 +++++++++++++++++++ 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index fa9ec2da4c3e..62af2fd52a1d 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -4104,7 +4104,7 @@ 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); @@ -4116,14 +4116,18 @@ ZEND_API int zend_update_static_property_ex(zend_class_entry *scope, zend_string 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); + Z_TRY_ADDREF_P(value); + if (prop_info->type) { + zval *val = zend_verify_property_type(prop_info, value, &tmp, /* strict */ 0); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, name, value); + Z_TRY_DELREF_P(value); + return FAILURE; + } + value = val; } + + zend_assign_to_variable(property, value, IS_VAR, /* strict */ 0); return SUCCESS; } /* }}} */ diff --git a/ext/reflection/tests/ReflectionProperty_typed_static.phpt b/ext/reflection/tests/ReflectionProperty_typed_static.phpt index 65e5069218d6..40d595cfd3d5 100644 --- a/ext/reflection/tests/ReflectionProperty_typed_static.phpt +++ b/ext/reflection/tests/ReflectionProperty_typed_static.phpt @@ -6,6 +6,7 @@ ReflectionProperty::getValue() on typed static property class Test { public static int $x = 42; public static int $y; + public static $z; } $rp = new ReflectionProperty('Test', 'x'); @@ -18,7 +19,33 @@ try { echo $e->getMessage(), "\n"; } +$rp->setValue("24"); +var_dump($rp->getValue()); + +try { + $rp->setValue("foo"); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($rp->getValue()); + +Test::$z =& Test::$y; + +$rp = new ReflectionProperty('Test', 'z'); +try { + $rp->setValue("foo"); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($rp->getValue()); + + ?> --EXPECT-- int(42) Typed static property Test::$y must not be accessed before initialization +int(24) +Typed property Test::$y must be int, string used +int(24) +Cannot assign string to reference of type int +int(24) From 8355232cbd7ce8730b1d7b24e95f465663b0a4d6 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 2 Jul 2018 22:26:52 +0200 Subject: [PATCH 280/369] Fix class check --- ext/reflection/php_reflection.c | 2 +- .../ReflectionProperty_isInitialized.phpt | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index dc5e74c20850..b567cef249b3 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -5624,7 +5624,7 @@ ZEND_METHOD(reflection_property, isInitialized) return; } - if (!instanceof_function(Z_OBJCE_P(object), ref->ce)) { + if (!instanceof_function(Z_OBJCE_P(object), ref->prop.ce)) { _DO_THROW("Given object is not an instance of the class this property was declared in"); /* Returns from this function */ } diff --git a/ext/reflection/tests/ReflectionProperty_isInitialized.phpt b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt index ce1b4bd45f81..587919605dc7 100644 --- a/ext/reflection/tests/ReflectionProperty_isInitialized.phpt +++ b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt @@ -10,8 +10,12 @@ class A { public ?int $iv = null; public ?int $i; public $n; + + private int $p; } +class B extends A { } + echo "Static properties:\n"; var_dump((new ReflectionProperty(A::class, 'ssv'))->isInitialized()); var_dump((new ReflectionProperty(A::class, 'ss'))->isInitialized()); @@ -38,6 +42,26 @@ var_dump($rp->isInitialized($a)); unset($a->d); var_dump($rp->isInitialized($a)); +echo "Visibility handling:\n"; +$rp = new ReflectionProperty('A', 'p'); +try { + var_dump($rp->isInitialized($a)); +} catch (ReflectionException $e) { + echo $e->getMessage(), "\n"; +} +$rp->setAccessible(true); +var_dump($rp->isInitialized($a)); + +echo "Object type:\n"; +$rp = new ReflectionProperty('B', 'i'); +var_dump($rp->isInitialized($a)); + +try { + var_dump($rp->isInitialized(new stdClass)); +} catch (ReflectionException $e) { + echo $e->getMessage(), "\n"; +} + ?> --EXPECT-- Static properties: @@ -55,3 +79,9 @@ bool(false) Dynamic properties: bool(true) bool(false) +Visibility handling: +Cannot access non-public member A::$p +bool(false) +Object type: +bool(false) +Given object is not an instance of the class this property was declared in From 13777bd7dbb2ab0f675a2b8838496969efdd5e11 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 2 Jul 2018 22:35:17 +0000 Subject: [PATCH 281/369] References are the intersection of all present property types at any time --- .../typed_properties_033.phpt | 2 +- .../typed_properties_034.phpt | 4 +- .../typed_properties_044.phpt | 4 +- .../typed_properties_045.phpt | 4 +- .../typed_properties_055.phpt | 2 +- .../typed_properties_062.phpt | 8 +- .../typed_properties_063.phpt | 8 +- .../typed_properties_064.phpt | 8 +- .../typed_properties_065.phpt | 6 +- .../typed_properties_068.phpt | 8 +- .../typed_properties_069.phpt | 2 +- .../typed_properties_078.phpt | 6 +- .../typed_properties_079.phpt | 4 +- .../typed_properties_081.phpt | 4 +- .../typed_properties_082.phpt | 4 +- Zend/zend_API.c | 8 +- Zend/zend_API.h | 11 +- Zend/zend_execute.c | 310 ++- Zend/zend_execute.h | 39 +- Zend/zend_object_handlers.c | 12 +- Zend/zend_objects.c | 4 +- Zend/zend_opcode.c | 2 +- Zend/zend_types.h | 8 - Zend/zend_vm_def.h | 179 +- Zend/zend_vm_execute.h | 1696 +++++++++-------- ext/reflection/php_reflection.c | 9 +- ...ctionClass_setStaticPropertyValue_003.phpt | 8 +- .../ReflectionProperty_typed_static.phpt | 2 +- ext/simplexml/simplexml.c | 4 - 29 files changed, 1251 insertions(+), 1115 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_033.phpt b/Zend/tests/type_declarations/typed_properties_033.phpt index 7ab7afec8ec2..a58c37fd22cb 100644 --- a/Zend/tests/type_declarations/typed_properties_033.phpt +++ b/Zend/tests/type_declarations/typed_properties_033.phpt @@ -25,7 +25,7 @@ try { var_dump($foo); ?> --EXPECTF-- -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->qux of type int object(class@anonymous)#1 (4) { ["foo"]=> int(2) diff --git a/Zend/tests/type_declarations/typed_properties_034.phpt b/Zend/tests/type_declarations/typed_properties_034.phpt index e6cb2ad271d6..d0ecd6d32285 100644 --- a/Zend/tests/type_declarations/typed_properties_034.phpt +++ b/Zend/tests/type_declarations/typed_properties_034.phpt @@ -38,11 +38,11 @@ var_dump($foo); ?> --EXPECTF-- int(42) -Cannot assign null to reference of type int +Typed property class@anonymous::$baz must be int, null used int(1) int(10) int(10) -Cannot assign null to reference of type int +Cannot assign null to reference held by property class@anonymous->baz of type int object(class@anonymous)#1 (2) { ["bar"]=> &int(10) diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt index 2fe689d95f07..f2632ef09e48 100644 --- a/Zend/tests/type_declarations/typed_properties_044.phpt +++ b/Zend/tests/type_declarations/typed_properties_044.phpt @@ -43,7 +43,7 @@ int(0) int(-2) int(-1) int(-1) -Cannot assign float to reference of type ?int -Cannot assign float to reference of type ?int +Cannot assign float to reference held by property class@anonymous->bar of type ?int +Cannot assign float to reference held by property class@anonymous->bar of type ?int int(-9223372036854775808) int(-9223372036854775808) diff --git a/Zend/tests/type_declarations/typed_properties_045.phpt b/Zend/tests/type_declarations/typed_properties_045.phpt index 830bbb121cb2..96733563e637 100644 --- a/Zend/tests/type_declarations/typed_properties_045.phpt +++ b/Zend/tests/type_declarations/typed_properties_045.phpt @@ -24,7 +24,7 @@ foreach ($foo = new Foo as $k => &$val) { --EXPECT-- int(0) int(20) -Cannot assign array to reference of type int +Cannot assign array to reference held by property Foo->bar of type int float(0.5) float(20) -Cannot assign array to reference of type float +Cannot assign array to reference held by property Foo->baz of type float diff --git a/Zend/tests/type_declarations/typed_properties_055.phpt b/Zend/tests/type_declarations/typed_properties_055.phpt index fd4921e07892..a648d97b63ae 100644 --- a/Zend/tests/type_declarations/typed_properties_055.phpt +++ b/Zend/tests/type_declarations/typed_properties_055.phpt @@ -22,7 +22,7 @@ $f($o->a->bar); int(1) int(2) -Fatal error: Uncaught TypeError: Cannot assign string to reference of type int in %s:%d +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} diff --git a/Zend/tests/type_declarations/typed_properties_062.phpt b/Zend/tests/type_declarations/typed_properties_062.phpt index 2f36daba93e7..f91e9ab758d7 100644 --- a/Zend/tests/type_declarations/typed_properties_062.phpt +++ b/Zend/tests/type_declarations/typed_properties_062.phpt @@ -52,14 +52,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference of type int +Cannot assign string to reference held by property class@anonymous->foo of type int int(21) int(20) int(19) -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->foo of type int integer -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->foo of type int integer -Cannot assign array to reference of type int +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 index abfde99d5b33..76567d2d7892 100644 --- a/Zend/tests/type_declarations/typed_properties_063.phpt +++ b/Zend/tests/type_declarations/typed_properties_063.phpt @@ -51,14 +51,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference of type int +Cannot assign string to reference held by property class@anonymous->foo of type int int(21) int(20) int(19) -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->foo of type int integer -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->foo of type int integer -Cannot assign array to reference of type int +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 index 08bc33a22feb..ae1dbc6deb33 100644 --- a/Zend/tests/type_declarations/typed_properties_064.phpt +++ b/Zend/tests/type_declarations/typed_properties_064.phpt @@ -51,14 +51,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference of type int +Cannot assign string to reference held by property class@anonymous->foo of type int int(21) int(20) int(19) -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->foo of type int integer -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->foo of type int integer -Cannot assign array to reference of type int +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 index 0ca8fecba7c1..78276a9d9a10 100644 --- a/Zend/tests/type_declarations/typed_properties_065.phpt +++ b/Zend/tests/type_declarations/typed_properties_065.phpt @@ -45,11 +45,11 @@ echo gettype($a->foo),"\n"; --EXPECT-- int(2) int(21) -Cannot assign string to reference of type int +Cannot assign string to reference held by property class@anonymous->foo of type int int(21) int(20) int(19) -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->foo of type int integer -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->foo of type int integer diff --git a/Zend/tests/type_declarations/typed_properties_068.phpt b/Zend/tests/type_declarations/typed_properties_068.phpt index 2cce66d63564..97deab9c570a 100644 --- a/Zend/tests/type_declarations/typed_properties_068.phpt +++ b/Zend/tests/type_declarations/typed_properties_068.phpt @@ -81,7 +81,7 @@ int(3) int(3) int(4) int(4) -Cannot assign null to reference of type int +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 @@ -91,12 +91,12 @@ string(1) "5" int(5) int(0) string(1) "0" -Cannot assign string to reference of type int +Typed property Foo::$i must be int, string used int(0) string(1) "x" -Static property and reference types int and string are not compatible +Static property type int is not compatible with the reference held by property Foo::$s of type string int(0) string(1) "5" -Static property and reference types string and int are not compatible +Static property type string is not compatible with the reference held by property Foo::$i of type int 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 index d0afa395bde2..946c316296d0 100644 --- a/Zend/tests/type_declarations/typed_properties_069.phpt +++ b/Zend/tests/type_declarations/typed_properties_069.phpt @@ -22,7 +22,7 @@ var_dump(nonNumericStringRef()); ?> --EXPECTF-- -Cannot assign string to reference of type int +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_078.phpt b/Zend/tests/type_declarations/typed_properties_078.phpt index 062c6b32c993..3ceb77f91c84 100644 --- a/Zend/tests/type_declarations/typed_properties_078.phpt +++ b/Zend/tests/type_declarations/typed_properties_078.phpt @@ -45,15 +45,15 @@ var_dump($ref instanceof ArrayIterator); --EXPECT-- array(0) { } -string(71) "Property and reference types ?Traversable and ?array are not compatible" +string(114) "Property type ?Traversable is not compatible with the reference held by property class@anonymous->a of type ?array" array(0) { } array(1) { [0]=> int(1) } -string(55) "Cannot assign ArrayIterator to reference of type ?array" +string(91) "Cannot assign ArrayIterator to reference held by property class@anonymous->a of type ?array" bool(false) -string(53) "Cannot assign array to reference of type ?Traversable" +string(89) "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 index 18ebf68762b4..449d6a56f116 100644 --- a/Zend/tests/type_declarations/typed_properties_079.phpt +++ b/Zend/tests/type_declarations/typed_properties_079.phpt @@ -26,9 +26,9 @@ var_dump($a); ?> --EXPECT-- -string(54) "Cannot assign ArrayIterator to reference of type array" +string(78) "Cannot assign ArrayIterator to reference held by property A::$a of type ?array" array(0) { } -string(45) "Cannot assign int to reference of type ?array" +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_081.phpt b/Zend/tests/type_declarations/typed_properties_081.phpt index e432b73e31f7..23b1abf825d8 100644 --- a/Zend/tests/type_declarations/typed_properties_081.phpt +++ b/Zend/tests/type_declarations/typed_properties_081.phpt @@ -13,11 +13,11 @@ $test2 = clone $test; unset($test); try { $x = "foo"; -} catch (TypeError $e) { var_dump($e->getMessage()); } +} catch (TypeError $e) { echo $e->getMessage(), "\n"; } var_dump($test2->x); ?> --EXPECT-- -string(45) "Cannot assign string to reference of type int" +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 index a42cc5525fd6..1e4e62e89b43 100644 --- a/Zend/tests/type_declarations/typed_properties_082.phpt +++ b/Zend/tests/type_declarations/typed_properties_082.phpt @@ -14,7 +14,7 @@ class Test2 extends Test { $x =& Test::$x; try { $x = "foo"; -} catch (TypeError $e) { var_dump($e->getMessage()); } +} catch (TypeError $e) { echo $e->getMessage(), "\n"; } var_dump($x, Test::$x); Test::$x =& Test2::$y; // remove the typed ref from $x @@ -23,7 +23,7 @@ var_dump($x, Test::$x); ?> --EXPECT-- -string(45) "Cannot assign string to reference of type int" +Cannot assign string to reference held by property Test::$x of type int int(0) int(0) string(3) "foo" diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 0e97968873df..834ab62202fc 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -704,7 +704,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons { zval **p = va_arg(*va, zval **); - if (Z_ISREF_P(real_arg) && Z_REFTYPE_P(real_arg) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(real_arg), IS_ARRAY)) { + if (Z_ISREF_P(real_arg) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(real_arg)) && !zend_verify_ref_assignable_type(Z_REF_P(real_arg), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) { return "array"; } @@ -1193,7 +1193,7 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */ } v = zend_verify_property_type(prop_info, &tmp, &tmp2, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); if (UNEXPECTED(!v)) { - zend_verify_property_type_error(prop_info, prop_info->name, &tmp); + zend_verify_property_type_error(prop_info, &tmp); class_type->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; zval_ptr_dtor(&tmp); return FAILURE; @@ -1261,7 +1261,7 @@ ZEND_API void object_properties_init_ex(zend_object *object, HashTable *properti val = zend_verify_property_type(property_info, prop, &tmp, 0); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(property_info, key, prop); + zend_verify_property_type_error(property_info, prop); continue; } ZVAL_COPY_VALUE(slot, val); @@ -4127,7 +4127,7 @@ ZEND_API int zend_update_static_property_ex(zend_class_entry *scope, zend_string if (prop_info->type) { zval *val = zend_verify_property_type(prop_info, value, &tmp, /* strict */ 0); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, name, value); + zend_verify_property_type_error(prop_info, value); Z_TRY_DELREF_P(value); return FAILURE; } diff --git a/Zend/zend_API.h b/Zend/zend_API.h index f7ae06fd293e..66e49aadc1e6 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -679,17 +679,18 @@ END_EXTERN_C() #define ZEND_GSHUTDOWN_FUNCTION ZEND_MODULE_GLOBALS_DTOR_D static zend_always_inline int zend_try_assign_ex(zval *zv, zval *arg, zend_bool silent, zend_bool strict) { - zend_type ref_type; - if (EXPECTED(Z_ISREF_P(zv)) && UNEXPECTED(ZEND_TYPE_IS_SET(ref_type = Z_REFTYPE_P(zv)))) { + zend_reference *ref; + if (EXPECTED(Z_ISREF_P(zv)) && UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref = Z_REF_P(zv)))) { + zend_property_info *error_prop; zval tmp; ZVAL_COPY_VALUE(&tmp, arg); - if (zend_verify_ref_type_assignable_zval(ref_type, &tmp, strict)) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, strict)) == NULL)) { zv = Z_REFVAL_P(zv); zval_ptr_dtor(zv); ZVAL_COPY_VALUE(zv, &tmp); } else { if (!silent) { - zend_throw_ref_type_error(ref_type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); } zval_ptr_dtor(&tmp); return FAILURE; @@ -1186,7 +1187,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha /* old "t" */ #define Z_PARAM_ARRAY_ASSIGNABLE_EX(dest, check_null, separate) \ Z_PARAM_PROLOGUE(1, separate); \ - if (Z_ISREF_P(_real_arg) && Z_REFTYPE_P(_real_arg) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(_real_arg), IS_ARRAY)) { \ + if (Z_ISREF_P(_real_arg) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(_real_arg)) && zend_verify_ref_assignable_type(Z_REF_P(_real_arg), ZEND_TYPE_ENCODE(IS_ARRAY, 0)) != NULL) { \ _expected_type = Z_EXPECTED_ARRAY; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index c5fbadd5483b..d1f132e97d63 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -914,7 +914,7 @@ 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, ret); } -ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property) +ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_info *info, zval *property) { /* 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)) { @@ -925,7 +925,7 @@ ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_i zend_throw_exception_ex(zend_ce_type_error, info->type, "Typed property %s::$%s must be an instance of %s%s, %s used", ZSTR_VAL(info->ce->name), - ZSTR_VAL(name), + ZSTR_VAL(info->name), ZSTR_VAL(ZEND_TYPE_IS_CE(info->type) ? ZEND_TYPE_CE(info->type)->name : zend_resolve_property_type(ZEND_TYPE_NAME(info->type), info->ce)), ZEND_TYPE_ALLOW_NULL(info->type) ? " or null" : "", Z_TYPE_P(property) == IS_OBJECT ? @@ -935,7 +935,7 @@ ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_i zend_throw_exception_ex(zend_ce_type_error, info->type, "Typed property %s::$%s must be %s%s, %s used", ZSTR_VAL(info->ce->name), - ZSTR_VAL(name), + ZSTR_VAL(info->name), zend_get_type_by_const(ZEND_TYPE_CODE(info->type)), ZEND_TYPE_ALLOW_NULL(info->type) ? " or null" : "", Z_TYPE_P(property) == IS_OBJECT ? @@ -1015,7 +1015,7 @@ zval* zend_verify_property_type(zend_property_info *info, zval *property, zval * return i_zend_verify_property_type(info, property, tmp, strict); } -static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(zend_type type, zval *zv, zend_bool strict) { +static zend_always_inline zend_bool i_zend_verify_type_assignable_zval(zend_type type, zval *zv, zend_bool strict) { zend_uchar cur_type; if (!ZEND_TYPE_IS_SET(type)) { @@ -1023,7 +1023,7 @@ static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(zend_ } ZVAL_DEREF(zv); - if (zend_verify_ref_type_assignable(type, Z_TYPE_P(zv))) { + if (zend_verify_type_assignable(type, Z_TYPE_P(zv))) { return 1; } @@ -1032,9 +1032,6 @@ static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(zend_ } cur_type = ZEND_TYPE_CODE(type); - if (cur_type == IS_CALLABLE) { - return zend_is_callable(zv, IS_CALLABLE_CHECK_SILENT, NULL); - } if (cur_type == IS_ITERABLE) { return zend_is_iterable(zv); } @@ -1042,9 +1039,9 @@ static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(zend_ return zend_verify_scalar_type_hint(cur_type, zv, zv, strict); } -ZEND_API zend_bool zend_verify_ref_type_assignable_zval(zend_type type, zval *zv, zend_bool strict) +ZEND_API zend_bool zend_verify_type_assignable_zval(zend_type type, zval *zv, zend_bool strict) { - return i_zend_verify_ref_type_assignable_zval(type, zv, strict); + return i_zend_verify_type_assignable_zval(type, zv, strict); } static zend_always_inline zend_bool zend_check_type( @@ -1053,14 +1050,15 @@ static zend_always_inline zend_bool zend_check_type( zval *default_value, zend_class_entry *scope, zend_bool is_return_type) { - zend_type ref_type = 0; + + zend_reference *ref = NULL; if (!ZEND_TYPE_IS_SET(type)) { return 1; } if (UNEXPECTED(Z_ISREF_P(arg))) { - ref_type = Z_REFTYPE_P(arg); + ref = Z_REF_P(arg); arg = Z_REFVAL_P(arg); } @@ -1094,7 +1092,7 @@ 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_type) { + } 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, arg, @@ -1320,19 +1318,20 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval * ZVAL_COPY_VALUE(z, value); } if (UNEXPECTED(Z_ISREF_P(z))) { - zend_type type = Z_REFTYPE_P(z); - zval *ref = Z_REFVAL_P(z); - binary_op(&res, ref, value); - if (type && !zend_verify_ref_type_assignable_zval(type, &res, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { - zend_throw_ref_type_error(type, &res); + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(z); + zval *refval = Z_REFVAL_P(z); + binary_op(&res, refval, value); + if (ZEND_REF_HAS_TYPE_SOURCES(ref) && (error_prop = zend_verify_ref_assignable_zval(ref, &res, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) != NULL) { + zend_throw_ref_type_error_zval(error_prop, &res); zval_ptr_dtor(&res); if (z == &rv) { zval_ptr_dtor(&rv); } return; } - zval_ptr_dtor(ref); - ZVAL_COPY(ref, &res); + zval_ptr_dtor(refval); + ZVAL_COPY(refval, &res); } else { binary_op(&res, z, value); Z_OBJ_HT_P(object)->write_dimension(object, property, &res); @@ -1627,7 +1626,7 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i val = zend_verify_property_type(prop_info, prop, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, prop); + zend_verify_property_type_error(prop_info, prop); if (inc) { ZVAL_LONG(prop, ZEND_LONG_MAX); } else { @@ -1636,13 +1635,15 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i } } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (Z_ISREF_P(prop)) { - ref_type = Z_REFTYPE_P(prop); + if (ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(prop))) { + ref = Z_REF_P(prop); + } prop = Z_REFVAL_P(prop); } - if (UNEXPECTED(ref_type || prop_info)) { + if (UNEXPECTED(ref || prop_info)) { /* special case for typed properties */ zval z_copy; @@ -1652,14 +1653,14 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i } else { decrement_function(&z_copy); } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -1692,7 +1693,7 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ val = zend_verify_property_type(prop_info, prop, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, prop); + zend_verify_property_type_error(prop_info, prop); if (inc) { ZVAL_LONG(prop, ZEND_LONG_MAX); } else { @@ -1702,15 +1703,17 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ } } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (Z_ISREF_P(prop)) { - ref_type = Z_REFTYPE_P(prop); + if (ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(prop))) { + ref = Z_REF_P(prop); + } prop = Z_REFVAL_P(prop); } ZVAL_COPY(EX_VAR(opline->result.var), prop); - if (UNEXPECTED(ref_type || prop_info)) { + if (UNEXPECTED(ref || prop_info)) { /* special case for typed properties */ zval z_copy; @@ -1720,14 +1723,14 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ } else { decrement_function(&z_copy); } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -2207,8 +2210,9 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * } if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) { if (type != BP_VAR_UNSET) { - if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_container), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_container)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_container)), + zend_property_info *error_prop; + if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_container), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); } else { array_init(container); @@ -2555,9 +2559,9 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } if (UNEXPECTED(prop_info)) { if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(ptr) <= IS_FALSE || (Z_ISREF_P(ptr) && Z_TYPE_P(Z_REFVAL_P(ptr)) == IS_NULL))) { - if (!zend_verify_ref_type_assignable(prop_info->type, IS_ARRAY)) { + if (!zend_verify_type_assignable(prop_info->type, IS_ARRAY)) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Cannot write an array to a null property which does not allow for array"); + "Cannot write an array to a null property which does not allow for array"); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); } @@ -2571,7 +2575,6 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } ZVAL_NEW_REF(ptr, ptr); - Z_REFTYPE_P(ptr) = zend_get_prop_info_ref_type(prop_info); ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ptr), prop_info); } } @@ -2724,7 +2727,9 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } if (flags) { - if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(*retval) <= IS_FALSE || (Z_ISREF_P(*retval) && Z_TYPE_P(Z_REFVAL_P(*retval)) == IS_NULL)) && !zend_verify_ref_type_assignable(property_info->type, IS_ARRAY)) { + if ((flags & ZEND_FETCH_DIM_WRITE) + && (Z_TYPE_P(*retval) <= IS_FALSE || (Z_ISREF_P(*retval) && Z_TYPE_P(Z_REFVAL_P(*retval)) == IS_NULL)) + && !zend_verify_type_assignable(property_info->type, IS_ARRAY)) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), "Cannot write an array to a null property which does not allow for array"); return FAILURE; @@ -2736,8 +2741,9 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, return FAILURE; } ZVAL_NEW_REF(ref, ref); - Z_REFTYPE_P(ref) = zend_get_prop_info_ref_type(property_info); - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ref), property_info); + if (property_info->type) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ref), property_info); + } } } @@ -2748,126 +2754,118 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, return SUCCESS; } -ZEND_API ZEND_COLD void zend_throw_ref_type_error(zend_type type, zval *zv) { - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Cannot assign %s to reference 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)), - ZEND_TYPE_ALLOW_NULL(type) ? "?" : "", - ZEND_TYPE_IS_CLASS(type) ? ZSTR_VAL(ZEND_TYPE_CE(type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(type)) - ); -} - -static zend_always_inline void swap_types(zend_type *type1, zend_type *type2) { - zend_type tmp = *type1; - *type1 = *type2; - *type2 = tmp; -} - -/* Returns intersection type, or type "void" if intersection impossible, or 0 if intersection - * currently not representable. */ -static zend_type compute_intersection_type(zend_type type1, zend_type type2) { - if (type1 == type2) { - return type1; - } +/* detects impossible intersections of types */ +static zend_always_inline zend_property_info *i_zend_verify_ref_assignable_type(zend_reference *ref, zend_type type) { + zend_property_info *prop; - /* If one of the type is "mixed", the intersection is the other type. */ - if (!ZEND_TYPE_IS_SET(type1)) { - return type2; - } else if (!ZEND_TYPE_IS_SET(type2)) { - return type1; + if (!ZEND_REF_HAS_TYPE_SOURCES(ref)) { + return NULL; } - /* Intersection is nullable only if both are nullable. */ - if (ZEND_TYPE_ALLOW_NULL(type1) != ZEND_TYPE_ALLOW_NULL(type2)) { - type1 = ZEND_TYPE_WITHOUT_NULL(type1); - type2 = ZEND_TYPE_WITHOUT_NULL(type2); - } + if (ZEND_TYPE_IS_CLASS(type)) { + /* interfaces can be intersected with any other interface, object and iterable; classes must be */ + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + zend_type prop_type = prop->type; + if (ZEND_TYPE_IS_CLASS(prop_type)) { + if ((!(ZEND_TYPE_CE(type)->ce_flags & ZEND_ACC_INTERFACE) || !(ZEND_TYPE_CE(prop_type)->ce_flags & ZEND_ACC_INTERFACE)) + && !instanceof_function(ZEND_TYPE_CE(prop_type), ZEND_TYPE_CE(type)) && !instanceof_function(ZEND_TYPE_CE(type), ZEND_TYPE_CE(prop_type))) { + return prop; + } + } else if (ZEND_TYPE_CODE(prop_type) != IS_OBJECT && (ZEND_TYPE_CODE(prop_type) != IS_ITERABLE || (!(ZEND_TYPE_CE(type)->ce_flags & ZEND_ACC_INTERFACE) && !instanceof_function(ZEND_TYPE_CE(type), zend_ce_traversable)))) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + } else { + switch (ZEND_TYPE_CODE(type)) { + case IS_OBJECT: + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (!ZEND_TYPE_IS_CLASS(prop->type) && ZEND_TYPE_CODE(prop->type) != IS_OBJECT && ZEND_TYPE_CODE(prop->type) != IS_ITERABLE) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + return NULL; - /* For class types, we can only handle cases where one type is a child of the other. - * Anything else would require full intersection types. */ - if (ZEND_TYPE_IS_CLASS(type1) && ZEND_TYPE_IS_CLASS(type2)) { - if (instanceof_function(ZEND_TYPE_CE(type1), ZEND_TYPE_CE(type2))) { - return type1; - } else if (instanceof_function(ZEND_TYPE_CE(type2), ZEND_TYPE_CE(type1))) { - return type2; - } - return 0; - } + case IS_ARRAY: + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (ZEND_TYPE_IS_CLASS(prop->type) || (ZEND_TYPE_CODE(prop->type) != IS_ITERABLE && ZEND_TYPE_CODE(prop->type) != IS_ARRAY)) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + return NULL; - if (ZEND_TYPE_IS_CODE(type1) && ZEND_TYPE_IS_CODE(type2)) { - if (ZEND_TYPE_CODE(type1) == ZEND_TYPE_CODE(type2)) { - return type1; - } + case IS_ITERABLE: + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (ZEND_TYPE_IS_CLASS(prop->type) ? !(ZEND_TYPE_CE(prop->type)->ce_flags & ZEND_ACC_INTERFACE) && !instanceof_function(ZEND_TYPE_CE(prop->type), zend_ce_traversable) : (ZEND_TYPE_CODE(prop->type) != IS_ITERABLE && ZEND_TYPE_CODE(prop->type) != IS_ARRAY && ZEND_TYPE_CODE(prop->type) != IS_OBJECT)) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + return NULL; - /* Make sure the smaller code is on the left. */ - if (ZEND_TYPE_CODE(type1) > ZEND_TYPE_CODE(type2)) { - swap_types(&type1, &type2); + case _IS_BOOL: + case IS_LONG: + case IS_DOUBLE: + case IS_STRING: + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (ZEND_TYPE_WITHOUT_NULL(prop->type) == ZEND_TYPE_WITHOUT_NULL(type)) { + return NULL; + } + return prop; + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + /* break intentionally missing */ + default: + ZEND_ASSERT(0); } } - - /* Make sure class type (if any) is on the right. */ - if (ZEND_TYPE_IS_CLASS(type1)) { - swap_types(&type1, &type2); - } - - ZEND_ASSERT(ZEND_TYPE_IS_CODE(type1)); - switch (ZEND_TYPE_CODE(type1)) { - case _IS_BOOL: - case IS_LONG: - case IS_DOUBLE: - case IS_STRING: - break; - case IS_ARRAY: - if (ZEND_TYPE_IS_CODE(type2) && ZEND_TYPE_CODE(type2) == IS_ITERABLE) { - return type1; - } - break; - case IS_OBJECT: - if (ZEND_TYPE_IS_CLASS(type2)) { - return type2; - } - break; - case IS_ITERABLE: - if (ZEND_TYPE_IS_CLASS(type2) && - instanceof_function(ZEND_TYPE_CE(type2), zend_ce_traversable)) { - return type2; - } - if (ZEND_TYPE_IS_CODE(type2) && ZEND_TYPE_CODE(type2) == IS_OBJECT) { - return ZEND_TYPE_ENCODE_CLASS(zend_ce_traversable, ZEND_TYPE_ALLOW_NULL(type1)); - } - break; - default: - ZEND_ASSERT(0); - break; - } - - /* Intersection is empty */ - return ZEND_TYPE_ENCODE(IS_VOID, 0); + return NULL; } -static zend_always_inline zend_type i_zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type) { - zend_type intersect_type = compute_intersection_type(old_type, ref_type); - if (EXPECTED(intersect_type != 0 && intersect_type != ZEND_TYPE_ENCODE(IS_VOID, 0))) { - return intersect_type; - } +ZEND_API zend_property_info *zend_verify_ref_assignable_type(zend_reference *ref, zend_type type) { + return i_zend_verify_ref_assignable_type(ref, type); +} - /* TODO(typed_refs) Throw different errors for "intersection illegal" and "can't represent - * intersection" cases? */ +ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(const char *source, zend_property_info *prop, zend_type type) { zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(ref_type) ? IS_OBJECT : ZEND_TYPE_CODE(ref_type), - "%s and reference types %s%s and %s%s are not compatible", + zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop->type), + "%s type %s%s is not compatible with the reference held by property %s%s%s of type %s%s", source, - ZEND_TYPE_ALLOW_NULL(ref_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(ref_type) ? ZSTR_VAL(ZEND_TYPE_CE(ref_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(ref_type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) + ZEND_TYPE_ALLOW_NULL(type) ? "?" : "", + ZEND_TYPE_IS_CLASS(type) ? ZSTR_VAL(ZEND_TYPE_CE(type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(type)), + ZSTR_VAL(prop->ce->name), + (prop->flags & ZEND_ACC_STATIC) ? "::$" : "->", + ZSTR_VAL(prop->name), + ZEND_TYPE_ALLOW_NULL(prop->type) ? "?" : "", + ZEND_TYPE_IS_CLASS(prop->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop->type)) + ); +} + +ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zval *zv) { + zend_throw_exception_ex( + zend_ce_type_error, 0, + "Cannot assign %s to reference held by property %s%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), + (prop->flags & ZEND_ACC_STATIC) ? "::$" : "->", + ZSTR_VAL(prop->name), + ZEND_TYPE_ALLOW_NULL(prop->type) ? "?" : "", + ZEND_TYPE_IS_CLASS(prop->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop->type)) ); - return 0; } -ZEND_API zend_type zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type) { - return i_zend_check_typed_assign_typed_ref(source, old_type, ref_type); +static zend_always_inline zend_property_info *i_zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict) { + zend_property_info *prop; + + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (!i_zend_verify_type_assignable_zval(prop->type, zv, strict)) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + + return NULL; +} + +ZEND_API zend_property_info *zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict) +{ + return i_zend_verify_ref_assignable_zval(ref, zv, strict); } ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop) @@ -2894,23 +2892,22 @@ ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_li list->ptr[list->num++] = prop; } -ZEND_API zend_type zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop) +ZEND_API void zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop) { zend_property_info_list *list = ZEND_PROPERTY_INFO_SOURCE_TO_LIST(source_list->list); - zend_type type = 0; - zend_property_info **end, **ptr; + zend_property_info **ptr; if (!ZEND_PROPERTY_INFO_SOURCE_IS_LIST(source_list->list)) { ZEND_ASSERT(source_list->ptr == prop); source_list->ptr = NULL; - return 0; + return; } if (list->num == 1) { ZEND_ASSERT(*list->ptr == prop); efree(list); source_list->ptr = NULL; - return 0; + return; } --list->num; @@ -2921,17 +2918,10 @@ ZEND_API zend_type zend_ref_del_type_source(zend_property_info_source_list *sour } *ptr = list->ptr[list->num]; - ptr = list->ptr, end = ptr + list->num; - do { - type = compute_intersection_type(type, (*ptr)->type); - } while (++ptr != end); - 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 *))); } - - return type; } static zend_never_inline void zend_fetch_this_var(int type OPLINE_DC EXECUTE_DATA_DC) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 6a2b55c61a45..1f4dee0ce5e6 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -58,7 +58,7 @@ ZEND_API void ZEND_FASTCALL zend_check_internal_arg_type(zend_function *zf, uint ZEND_API int ZEND_FASTCALL zend_check_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot); ZEND_API ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(zend_execute_data *execute_data); -ZEND_API zend_type zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type); +ZEND_API zend_type zend_check_typed_assign_typed_ref(const char *source, zend_type type, zend_reference *ref); ZEND_API zend_bool zend_load_property_class_type(zend_property_info *info); @@ -74,7 +74,7 @@ static zend_always_inline zend_type zend_get_prop_info_ref_type(zend_property_in } /* do not call when new_type == IS_REFERENCE or new_type == IS_OBJECT! */ -static zend_always_inline zend_bool zend_verify_ref_type_assignable(zend_type type, zend_uchar new_type) { +static zend_always_inline zend_bool zend_verify_type_assignable(zend_type type, zend_uchar new_type) { if (!type) { return 1; } @@ -85,8 +85,20 @@ static zend_always_inline zend_bool zend_verify_ref_type_assignable(zend_type ty || (cur_type == IS_ITERABLE && new_type == IS_ARRAY); } -ZEND_API zend_bool zend_verify_ref_type_assignable_zval(zend_type type, zval *zv, zend_bool strict); -ZEND_API ZEND_COLD void zend_throw_ref_type_error(zend_type type, zval *zv); +ZEND_API zend_property_info *zend_verify_ref_assignable_type(zend_reference *ref, zend_type type); +ZEND_API zend_property_info *zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, 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(const char *source, zend_property_info *prop, zend_type type); + +#define ZEND_REF_TYPE_SOURCES(ref) \ + (ref)->sources + +#define ZEND_REF_HAS_TYPE_SOURCES(ref) \ + (ZEND_REF_TYPE_SOURCES(ref).ptr != NULL) + +ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); +ZEND_API void zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type, zend_bool strict) { @@ -103,14 +115,15 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval zend_refcounted *garbage; if (Z_ISREF_P(variable_ptr)) { - if (UNEXPECTED(Z_REFTYPE_P(variable_ptr))) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) { + zend_property_info *error_prop; zend_bool need_copy = (value_type & (IS_CONST|IS_CV)) || ((value_type & IS_VAR) && UNEXPECTED(ref) && Z_REFCOUNT_P(variable_ptr) > 1); if (need_copy) { ZVAL_COPY(&tmp, value); value = &tmp; } - if (!zend_verify_ref_type_assignable_zval(Z_REFTYPE_P(variable_ptr), value, strict)) { - zend_throw_ref_type_error(Z_REFTYPE_P(variable_ptr), value); + if ((error_prop = zend_verify_ref_assignable_zval(Z_REF_P(variable_ptr), value, strict)) != NULL) { + zend_throw_ref_type_error_zval(error_prop, value); zval_ptr_dtor(value); return Z_REFVAL_P(variable_ptr); } @@ -471,16 +484,7 @@ static zend_always_inline zend_property_info* zend_object_fetch_property_type_in } zval* zend_verify_property_type(zend_property_info *info, zval *property, zval *tmp, zend_bool strict); -ZEND_COLD void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property); - -#define ZEND_REF_TYPE_SOURCES(ref) \ - (ref)->sources - -#define ZEND_REF_HAS_TYPE_SOURCES(ref) \ - (ZEND_REF_TYPE_SOURCES(ref).ptr != NULL) - -ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); -ZEND_API zend_type zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); +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) @@ -514,6 +518,7 @@ ZEND_API zend_type zend_ref_del_type_source(zend_property_info_source_list *sour } \ } while (0) + END_EXTERN_C() #endif /* ZEND_EXECUTE_H */ diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 7ecec0bd3eb7..6c7c38e761d8 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -733,8 +733,10 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void zval *val = retval; if (Z_ISREF_P(val)) { + zend_property_info *error_prop; /* the overloaded property type must be compatible with the reference type so that we don't coercively cast and end up with a value type not matching the reference type */ - if (zend_check_typed_assign_typed_ref("Property", Z_REFTYPE_P(val), zend_get_prop_info_ref_type(prop_info)) == 0) { + if ((error_prop = zend_verify_ref_assignable_type(Z_REF_P(val), zend_get_prop_info_ref_type(prop_info)))) { + zend_throw_ref_type_error_type("Property", error_prop, zend_get_prop_info_ref_type(prop_info)); goto exit; } /* we do not add a reference type here - reference types must be backed up by references being assigned to an actual typed container */ @@ -742,7 +744,7 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void } if (UNEXPECTED(zend_verify_property_type(prop_info, val, val, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES)) == NULL)) { - zend_verify_property_type_error(prop_info, Z_STR_P(member), val); + zend_verify_property_type_error(prop_info, val); } } goto exit; @@ -808,7 +810,7 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, if (UNEXPECTED(prop_info)) { val = zend_verify_property_type(prop_info, value, &tmp, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(member), value); + zend_verify_property_type_error(prop_info, value); Z_TRY_DELREF_P(value); value = &EG(error_zval); goto exit; @@ -879,7 +881,7 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot))) { val = zend_verify_property_type(prop_info, value, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(member), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); goto exit; } @@ -1097,7 +1099,7 @@ ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_s if (UNEXPECTED(Z_ISREF_P(slot)) && Z_REFCOUNT_P(slot) > 1) { zend_property_info *prop_info = zend_hash_find_ptr(&zobj->ce->properties_info, Z_STR_P(member)); if (UNEXPECTED(prop_info->type)) { - Z_REFTYPE_P(slot) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(slot), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(slot), prop_info); } } zval_ptr_dtor(slot); diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 41c2f65068c5..2a06c491a4fc 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -59,7 +59,7 @@ ZEND_API void zend_object_std_dtor(zend_object *object) zend_property_info *prop_info; ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(p), prop_info) { if (prop_info->ce == object->ce && p == OBJ_PROP(object, prop_info->offset)) { - Z_REFTYPE_P(p) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); + 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(); @@ -203,7 +203,7 @@ ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object, i_zval_ptr_dtor(dst ZEND_FILE_LINE_CC); ZVAL_COPY_VALUE(dst, src); zval_add_ref(dst); - if (UNEXPECTED(Z_ISREF_P(dst)) && UNEXPECTED(Z_REFTYPE_P(dst) != NULL)) { + if (UNEXPECTED(Z_ISREF_P(dst))) { zend_property_info *prop_info; ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(dst), prop_info) { if (prop_info->ce == new_object->ce && dst == OBJ_PROP(new_object, prop_info->offset)) { diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index acf2a1d5708b..7c7851ab42e3 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -244,7 +244,7 @@ ZEND_API void destroy_zend_class(zval *zv) 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) { - Z_REFTYPE_P(p) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); + 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(); diff --git a/Zend/zend_types.h b/Zend/zend_types.h index c9b88abb8930..1391e17cc7cb 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -404,7 +404,6 @@ typedef union { struct _zend_reference { zend_refcounted_h gc; zval val; - zend_type type; zend_property_info_source_list sources; }; @@ -722,9 +721,6 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { #define Z_REFVAL(zval) &Z_REF(zval)->val #define Z_REFVAL_P(zval_p) Z_REFVAL(*(zval_p)) -#define Z_REFTYPE(zval) Z_REF(zval)->type -#define Z_REFTYPE_P(zval_p) Z_REFTYPE(*(zval_p)) - #define Z_AST(zval) (zval).value.ast #define Z_AST_P(zval_p) Z_AST(*(zval_p)) @@ -890,7 +886,6 @@ 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->type = 0; \ _ref->sources.ptr = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ @@ -902,7 +897,6 @@ 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->type = 0; \ _ref->sources.ptr = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ @@ -915,7 +909,6 @@ 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->type = 0; \ _ref->sources.ptr = NULL; \ Z_REF_P(_z) = _ref; \ Z_TYPE_INFO_P(_z) = IS_REFERENCE_EX; \ @@ -928,7 +921,6 @@ 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->type = 0; \ _ref->sources.ptr = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 5eafcada6c92..f957b9112591 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -834,10 +834,12 @@ ZEND_VM_C_LABEL(assign_op_object): ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -847,19 +849,19 @@ ZEND_VM_C_LABEL(assign_op_object): } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -891,7 +893,8 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -908,24 +911,25 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -936,7 +940,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE 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); @@ -977,16 +981,17 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array): value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if (OP2_TYPE != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP2(); FREE_OP(free_op_data1); @@ -1070,25 +1075,26 @@ ZEND_VM_HELPER(zend_binary_assign_op_simple_helper, VAR|CV, CONST|TMPVAR|CV, bin ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -1397,7 +1403,7 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1422,25 +1428,26 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); FREE_OP1_VAR_PTR(); HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -1460,7 +1467,7 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1485,25 +1492,26 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); FREE_OP1_VAR_PTR(); HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -1523,7 +1531,8 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_property_info *error_prop; + zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1544,7 +1553,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -1552,8 +1561,8 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) increment_function(var_ptr); - if (UNEXPECTED(ref_type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -1567,7 +1576,8 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_property_info *error_prop; + zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1588,7 +1598,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -1596,8 +1606,8 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) decrement_function(var_ptr); - if (UNEXPECTED(ref_type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -2315,7 +2325,7 @@ ZEND_VM_C_LABEL(assign_object): if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); FREE_OP_DATA(); FREE_OP2(); FREE_OP1_VAR_PTR(); @@ -2436,7 +2446,7 @@ ZEND_VM_HANDLER(200, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, val = i_zend_verify_property_type(prop_info, value, ((OP_DATA_TYPE & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); FREE_OP_DATA(); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -2528,8 +2538,9 @@ ZEND_VM_C_LABEL(try_assign_dim_array): FREE_OP_DATA(); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); FREE_UNFETCHED_OP2(); FREE_UNFETCHED_OP_DATA(); @@ -2694,7 +2705,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C FREE_OP2(); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((OP2_TYPE == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -2705,20 +2716,23 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); FREE_OP1_VAR_PTR(); FREE_OP2(); FREE_OP_DATA_VAR_PTR(); HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); FREE_OP1_VAR_PTR(); FREE_OP2(); FREE_OP_DATA_VAR_PTR(); @@ -2726,13 +2740,12 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -2753,7 +2766,7 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -2778,31 +2791,31 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - FREE_OP_DATA_VAR_PTR(); - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + FREE_OP_DATA_VAR_PTR(); + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); FREE_OP_DATA_VAR_PTR(); HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -6479,7 +6492,7 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR) zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(array), p->key, NULL); if (UNEXPECTED(prop_info)) { ZVAL_NEW_REF(value, value); - Z_REFTYPE_P(value) = zend_get_prop_info_ref_type(prop_info); + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(value), prop_info); value_type = IS_REFERENCE_EX; } } @@ -7844,7 +7857,7 @@ ZEND_VM_C_LABEL(check_indirect): if (UNEXPECTED(!Z_ISREF_P(value))) { ZVAL_MAKE_REF_EX(value, 2); ref = Z_REF_P(value); - ref->type = 0; + ref->sources.ptr = NULL; } else { ref = Z_REF_P(value); GC_ADDREF(ref); @@ -8250,7 +8263,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->type = 0; + ref->sources.ptr = NULL; Z_REF_P(value) = ref; Z_TYPE_INFO_P(value) = IS_REFERENCE_EX; ZVAL_REF(variable_ptr, ref); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 2f2ef1d60249..599a7d12c3ba 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4530,7 +4530,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -4547,24 +4548,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -5102,7 +5104,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -5154,7 +5156,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -5206,7 +5208,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -5258,7 +5260,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -5290,7 +5292,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -5315,31 +5317,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -7107,7 +7109,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -7124,24 +7127,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -8510,7 +8514,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -8562,7 +8566,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -8614,7 +8618,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -8666,7 +8670,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -8698,7 +8702,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -8723,31 +8727,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -8980,7 +8984,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -8997,24 +9002,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -9399,7 +9405,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -9451,7 +9457,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -9503,7 +9509,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -9555,7 +9561,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -9587,7 +9593,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -9612,31 +9618,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -14885,7 +14891,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -14937,7 +14943,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -14989,7 +14995,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -15041,7 +15047,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -15073,7 +15079,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -15098,31 +15104,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -17231,7 +17237,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -17283,7 +17289,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -17335,7 +17341,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -17387,7 +17393,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -17419,7 +17425,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -17444,31 +17450,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -17864,7 +17870,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -17916,7 +17922,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -17968,7 +17974,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -18020,7 +18026,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -18052,7 +18058,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -18077,31 +18083,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -20172,7 +20178,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -20189,24 +20196,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -20738,7 +20746,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -20755,24 +20764,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -21437,7 +21447,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -21454,24 +21465,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -22407,7 +22419,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22432,25 +22444,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -22470,7 +22483,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22495,25 +22508,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -22533,7 +22547,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22558,25 +22572,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -22596,7 +22611,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22621,25 +22636,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -22659,7 +22675,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_property_info *error_prop; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22680,7 +22697,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -22688,8 +22705,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND increment_function(var_ptr); - if (UNEXPECTED(ref_type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -22703,7 +22720,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_property_info *error_prop; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22724,7 +22742,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -22732,8 +22750,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND decrement_function(var_ptr); - if (UNEXPECTED(ref_type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -23735,7 +23753,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(array), p->key, NULL); if (UNEXPECTED(prop_info)) { ZVAL_NEW_REF(value, value); - Z_REFTYPE_P(value) = zend_get_prop_info_ref_type(prop_info); + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(value), prop_info); value_type = IS_REFERENCE_EX; } } @@ -24187,10 +24205,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -24200,19 +24220,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -24244,7 +24264,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -24261,24 +24282,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -24330,16 +24352,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -24422,25 +24445,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -25183,7 +25207,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25324,7 +25348,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25465,7 +25489,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25606,7 +25630,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25766,8 +25790,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -25863,8 +25888,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -25960,8 +25986,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -26056,8 +26083,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -26201,7 +26229,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -26212,20 +26240,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -26233,13 +26264,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -26312,7 +26342,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -26323,20 +26353,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26344,13 +26377,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -27038,10 +27070,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -27051,19 +27085,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -27095,7 +27129,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -27112,24 +27147,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -27181,16 +27217,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); zval_ptr_dtor_nogc(free_op2); FREE_OP(free_op_data1); @@ -27274,25 +27311,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -28039,7 +28077,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -28180,7 +28218,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -28321,7 +28359,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -28462,7 +28500,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -28622,8 +28660,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -28719,8 +28758,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -28816,8 +28856,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -28912,8 +28953,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -29001,7 +29043,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -29012,20 +29054,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); 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);}; @@ -29033,13 +29078,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -29112,7 +29156,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -29123,20 +29167,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); @@ -29144,13 +29191,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -30063,7 +30109,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -30080,24 +30127,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -30149,16 +30197,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -30527,8 +30576,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -30624,8 +30674,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -30721,8 +30772,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -30817,8 +30869,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -31551,10 +31604,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -31564,19 +31619,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -31635,16 +31690,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -31727,25 +31783,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -32394,7 +32451,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -32535,7 +32592,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -32676,7 +32733,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -32817,7 +32874,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -32977,8 +33034,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -33074,8 +33132,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -33171,8 +33230,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -33267,8 +33327,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -33460,7 +33521,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -33471,20 +33532,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -33492,13 +33556,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -33571,7 +33634,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -33582,20 +33645,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33603,13 +33669,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -34479,10 +34544,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -34492,19 +34559,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -35082,7 +35149,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); @@ -35223,7 +35290,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -35364,7 +35431,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -35505,7 +35572,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); @@ -35658,7 +35725,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -35669,20 +35736,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -35690,13 +35760,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -35768,7 +35837,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -35779,20 +35848,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); @@ -35800,13 +35872,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -36550,10 +36621,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -36563,19 +36636,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -37157,7 +37230,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -37298,7 +37371,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -37439,7 +37512,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -37580,7 +37653,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -37733,7 +37806,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -37744,20 +37817,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -37765,13 +37841,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -37843,7 +37918,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -37854,20 +37929,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); zval_ptr_dtor_nogc(free_op2); @@ -37875,13 +37953,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -39253,10 +39330,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -39266,19 +39345,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -39856,7 +39935,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); @@ -39997,7 +40076,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -40138,7 +40217,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -40279,7 +40358,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); @@ -40432,7 +40511,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -40443,20 +40522,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -40464,13 +40546,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -40542,7 +40623,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -40553,20 +40634,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); @@ -40574,13 +40658,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -41219,7 +41302,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ USE_OPLINE zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -41244,25 +41327,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -41281,7 +41365,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA USE_OPLINE zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -41306,25 +41390,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -41343,7 +41428,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ USE_OPLINE zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -41368,25 +41453,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -41405,7 +41491,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA USE_OPLINE zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -41430,25 +41516,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -41467,7 +41554,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr; - zend_type ref_type = 0; + zend_property_info *error_prop; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -41488,7 +41576,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -41496,8 +41584,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ increment_function(var_ptr); - if (UNEXPECTED(ref_type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -41510,7 +41598,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr; - zend_type ref_type = 0; + zend_property_info *error_prop; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -41531,7 +41620,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -41539,8 +41628,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ decrement_function(var_ptr); - if (UNEXPECTED(ref_type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -43649,10 +43738,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -43662,19 +43753,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -43706,7 +43797,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -43723,24 +43815,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -43792,16 +43885,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -43884,25 +43978,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -45005,7 +45100,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); @@ -45146,7 +45241,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -45287,7 +45382,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -45428,7 +45523,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); @@ -45549,7 +45644,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -45601,7 +45696,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -45653,7 +45748,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -45705,7 +45800,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -45796,8 +45891,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -45893,8 +45989,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -45990,8 +46087,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46086,8 +46184,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -46231,7 +46330,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -46242,20 +46341,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -46263,13 +46365,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -46341,7 +46442,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -46352,20 +46453,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); @@ -46373,13 +46477,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -46399,7 +46502,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -46424,31 +46527,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -47378,7 +47481,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_GLOBAL_SPEC_C if (UNEXPECTED(!Z_ISREF_P(value))) { ZVAL_MAKE_REF_EX(value, 2); ref = Z_REF_P(value); - ref->type = 0; + ref->sources.ptr = NULL; } else { ref = Z_REF_P(value); GC_ADDREF(ref); @@ -47446,7 +47549,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_STATIC_SPEC_CV_CONST_HAND GC_SET_REFCOUNT(ref, 2); GC_TYPE_INFO(ref) = IS_REFERENCE; ZVAL_COPY_VALUE(&ref->val, value); - ref->type = 0; + ref->sources.ptr = NULL; Z_REF_P(value) = ref; Z_TYPE_INFO_P(value) = IS_REFERENCE_EX; ZVAL_REF(variable_ptr, ref); @@ -48289,10 +48392,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -48302,19 +48407,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -48346,7 +48451,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -48363,24 +48469,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -48432,16 +48539,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); zval_ptr_dtor_nogc(free_op2); FREE_OP(free_op_data1); @@ -48525,25 +48633,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -49538,7 +49647,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -49679,7 +49788,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -49820,7 +49929,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -49961,7 +50070,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -50121,8 +50230,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50218,8 +50328,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -50315,8 +50426,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -50411,8 +50523,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50500,7 +50613,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -50511,20 +50624,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -50532,13 +50648,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -50610,7 +50725,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -50621,20 +50736,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); zval_ptr_dtor_nogc(free_op2); @@ -50642,13 +50760,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -51673,7 +51790,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -51725,7 +51842,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -51777,7 +51894,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -51829,7 +51946,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -51966,7 +52083,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -51991,31 +52108,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -52297,7 +52414,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -52314,24 +52432,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -52383,16 +52502,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -52955,7 +53075,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -53007,7 +53127,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -53059,7 +53179,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -53111,7 +53231,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -53202,8 +53322,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -53299,8 +53420,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -53396,8 +53518,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -53492,8 +53615,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -53529,7 +53653,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -53554,31 +53678,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -55033,10 +55157,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -55046,19 +55172,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -55117,16 +55243,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -55209,25 +55336,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -56122,7 +56250,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); @@ -56263,7 +56391,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -56404,7 +56532,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -56545,7 +56673,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); @@ -56705,8 +56833,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -56802,8 +56931,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -56899,8 +57029,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -56995,8 +57126,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -57188,7 +57320,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -57199,20 +57331,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -57220,13 +57355,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -57298,7 +57432,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -57309,20 +57443,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); @@ -57330,13 +57467,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index b567cef249b3..b394846a9c50 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3948,17 +3948,18 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) } if (Z_ISREF_P(variable_ptr)) { - zend_type ref_type = Z_REFTYPE_P(variable_ptr); + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(variable_ptr); variable_ptr = Z_REFVAL_P(variable_ptr); - if (ref_type && !zend_verify_ref_type_assignable_zval(ref_type, value, 0)) { - zend_throw_ref_type_error(ref_type, value); + if ((error_prop = zend_verify_ref_assignable_zval(ref, value, 0)) != NULL) { + zend_throw_ref_type_error_zval(error_prop, value); return; } } if (prop_info->type && !zend_verify_property_type(prop_info, value, value, 0)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); return; } diff --git a/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt index 524985ec1e88..a83900a12317 100644 --- a/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt +++ b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt @@ -12,7 +12,7 @@ $rc = new ReflectionClass('Test'); try { $rc->setStaticPropertyValue("y", "foo"); -} catch (TypeError $e) { var_dump($e->getMessage()); } +} catch (TypeError $e) { echo $e->getMessage(), "\n"; } var_dump(Test::$y); $rc->setStaticPropertyValue("y", "21"); @@ -23,7 +23,7 @@ Test::$x =& Test::$y; try { $rc->setStaticPropertyValue("x", "foo"); -} catch (TypeError $e) { var_dump($e->getMessage()); } +} catch (TypeError $e) { echo $e->getMessage(), "\n"; } var_dump(Test::$y); $rc->setStaticPropertyValue("x", "42"); @@ -31,9 +31,9 @@ var_dump(Test::$y); ?> --EXPECT-- -string(48) "Typed property Test::$y must be int, string used" +Typed property Test::$y must be int, string used int(2) int(21) -string(45) "Cannot assign string to reference of type int" +Cannot assign string to reference held by property Test::$y of type int int(21) int(42) diff --git a/ext/reflection/tests/ReflectionProperty_typed_static.phpt b/ext/reflection/tests/ReflectionProperty_typed_static.phpt index 40d595cfd3d5..cc69dd823044 100644 --- a/ext/reflection/tests/ReflectionProperty_typed_static.phpt +++ b/ext/reflection/tests/ReflectionProperty_typed_static.phpt @@ -47,5 +47,5 @@ Typed static property Test::$y must not be accessed before initialization int(24) Typed property Test::$y must be int, string used int(24) -Cannot assign string to reference of type int +Cannot assign string to reference held by property Test::$y of type int int(24) diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index f4c4a188c921..b0c567707d33 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -435,7 +435,6 @@ static zval *sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bo int test = 0; int new_value = 0; zend_long cnt = 0; - int retval = SUCCESS; zval tmp_zv, zval_copy; zend_string *trim_str; @@ -628,14 +627,12 @@ static zval *sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bo } else if (!member || Z_TYPE_P(member) == IS_LONG) { if (member && cnt < Z_LVAL_P(member)) { php_error_docref(NULL, E_WARNING, "Cannot add element %s number " ZEND_LONG_FMT " when only " ZEND_LONG_FMT " such elements exist", mynode->name, Z_LVAL_P(member), cnt); - retval = FAILURE; } newnode = xmlNewTextChild(mynode->parent, mynode->ns, mynode->name, value ? (xmlChar *)Z_STRVAL_P(value) : NULL); } } else if (attribs) { if (Z_TYPE_P(member) == IS_LONG) { php_error_docref(NULL, E_WARNING, "Cannot change attribute number " ZEND_LONG_FMT " when only %d attributes exist", Z_LVAL_P(member), nodendx); - retval = FAILURE; } else { newnode = (xmlNodePtr)xmlNewProp(node, (xmlChar *)Z_STRVAL_P(member), value ? (xmlChar *)Z_STRVAL_P(value) : NULL); } @@ -650,7 +647,6 @@ static zval *sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bo } if (new_value) { zval_ptr_dtor(value); - return new_value; } return value; } From 428a00f4a131f2fe6d139183a7a7b922d6f13c9a Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 2 Jul 2018 22:47:59 +0000 Subject: [PATCH 282/369] Fix a last test --- ext/standard/tests/array/extract_typed_ref.phpt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/standard/tests/array/extract_typed_ref.phpt b/ext/standard/tests/array/extract_typed_ref.phpt index d329f2b7b105..f480a410946b 100644 --- a/ext/standard/tests/array/extract_typed_ref.phpt +++ b/ext/standard/tests/array/extract_typed_ref.phpt @@ -13,11 +13,11 @@ $i =& $test->i; $s =& $test->s; try { extract(['i' => 'foo', 's' => 42]); -} catch (TypeError $e) { var_dump($e->getMessage()); } +} catch (TypeError $e) { echo $e->getMessage(), "\n"; } var_dump($test->i, $test->s); ?> --EXPECT-- -string(45) "Cannot assign string to reference of type int" +Cannot assign string to reference held by property Test->i of type int int(0) string(2) "42" From e888cf14b485bc10ae9e0d4eda74e4c5312db180 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 3 Jul 2018 20:55:15 +0200 Subject: [PATCH 283/369] Remove 't' zpp type The 't' type will not be usable by extensions. Replace it with zend_try_array_init(_size) functions. --- Zend/zend_API.c | 12 ------------ Zend/zend_API.h | 22 ++++++++++++++++++++++ ext/enchant/enchant.c | 8 +++++--- ext/intl/idn/idn.c | 8 +++++--- ext/ldap/ldap.c | 25 +++++++++++++++++-------- ext/mbstring/mbstring.c | 9 +++++---- ext/mbstring/php_mbregex.c | 8 +++++--- ext/oci8/oci8_interface.c | 19 ++++++++++++------- ext/odbc/php_odbc.c | 9 +++++---- ext/openssl/openssl.c | 26 +++++++++++++++++--------- ext/pcntl/pcntl.c | 34 +++++++++++++++++++++------------- ext/soap/soap.c | 12 ++++++++---- ext/sockets/sockets.c | 10 +++++++--- ext/standard/dns_win32.c | 29 +++++++++++++++++++---------- ext/xml/xml.c | 14 +++++++++----- 15 files changed, 157 insertions(+), 88 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 834ab62202fc..004421dde155 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -700,18 +700,6 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons } break; - case 't': - { - zval **p = va_arg(*va, zval **); - - if (Z_ISREF_P(real_arg) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(real_arg)) && !zend_verify_ref_assignable_type(Z_REF_P(real_arg), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) { - return "array"; - } - - zend_parse_arg_zval_deref(arg, p, check_null); - } - break; - case 'o': { zval **p = va_arg(*va, zval **); diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 66e49aadc1e6..c6308cf4f3c7 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -774,6 +774,28 @@ static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { zend_try_assign(zv, &_zv); \ } 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(zval *zv) { + zval tmp; + ZVAL_ARR(&tmp, zend_new_array(0)); + if (UNEXPECTED(zend_try_assign(zv, &tmp) == FAILURE)) { + return NULL; + } + ZVAL_DEREF(zv); + return zv; +} + +static zend_always_inline zval *zend_try_array_init_size(zval *zv, size_t size) { + zval tmp; + ZVAL_ARR(&tmp, zend_new_array(size)); + if (UNEXPECTED(zend_try_assign(zv, &tmp) == FAILURE)) { + return NULL; + } + ZVAL_DEREF(zv); + return zv; +} + /* Fast parameter parsing API */ /* Fast ZPP is always enabled now; this define is left in for compatibility diff --git a/ext/enchant/enchant.c b/ext/enchant/enchant.c index 677adc47ddbe..eba6e33c58db 100644 --- a/ext/enchant/enchant.c +++ b/ext/enchant/enchant.c @@ -711,13 +711,15 @@ PHP_FUNCTION(enchant_dict_quick_check) size_t wordlen; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|t", &dict, &word, &wordlen, &sugg) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|z", &dict, &word, &wordlen, &sugg) == FAILURE) { RETURN_FALSE; } if (sugg) { - zval_ptr_dtor(sugg); - array_init(sugg); + sugg = zend_try_array_init(sugg); + if (!sugg) { + return; + } } PHP_ENCHANT_GET_DICT; diff --git a/ext/intl/idn/idn.c b/ext/intl/idn/idn.c index 5d8943c4b3a0..9cf61160a2ee 100644 --- a/ext/intl/idn/idn.c +++ b/ext/intl/idn/idn.c @@ -279,7 +279,7 @@ static void php_intl_idn_handoff(INTERNAL_FUNCTION_PARAMETERS, int mode) intl_error_reset(NULL); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|llt", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|llz", &domain, &option, &variant, &idna_info) == FAILURE) { php_intl_bad_args("bad arguments"); RETURN_NULL(); /* don't set FALSE because that's not the way it was before... */ @@ -319,8 +319,10 @@ static void php_intl_idn_handoff(INTERNAL_FUNCTION_PARAMETERS, int mode) "4 arguments were provided, but INTL_IDNA_VARIANT_2003 only " "takes 3 - extra argument ignored"); } else { - zval_dtor(idna_info); - array_init(idna_info); + idna_info = zend_try_array_init(idna_info); + if (!idna_info) { + return; + } } } diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index 2a654e43761a..3413d3655da6 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -578,7 +578,11 @@ static void _php_ldap_controls_to_array(LDAP *ld, LDAPControl** ctrls, zval* arr zval tmp1; LDAPControl **ctrlp; - array_init(array); + array = zend_try_array_init(array); + if (!array) { + return; + } + if (ctrls == NULL) { return; } @@ -3330,7 +3334,7 @@ PHP_FUNCTION(ldap_parse_result) char *lmatcheddn, *lerrmsg; int rc, lerrcode, myargcount = ZEND_NUM_ARGS(); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrz|zztt", &link, &result, &errcode, &matcheddn, &errmsg, &referrals, &serverctrls) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrz|zzzz", &link, &result, &errcode, &matcheddn, &errmsg, &referrals, &serverctrls) != SUCCESS) { return; } @@ -3360,8 +3364,10 @@ PHP_FUNCTION(ldap_parse_result) case 7: _php_ldap_controls_to_array(ld->link, lserverctrls, serverctrls, 0); case 6: - zval_ptr_dtor(referrals); - array_init(referrals); + referrals = zend_try_array_init(referrals); + if (!referrals) { + return; + } if (lreferrals != NULL) { refp = lreferrals; while (*refp) { @@ -3525,7 +3531,7 @@ PHP_FUNCTION(ldap_parse_reference) ldap_resultentry *resultentry; char **lreferrals, **refp; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrt", &link, &result_entry, &referrals) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrz", &link, &result_entry, &referrals) != SUCCESS) { return; } @@ -3541,8 +3547,11 @@ PHP_FUNCTION(ldap_parse_reference) RETURN_FALSE; } - zval_ptr_dtor(referrals); - array_init(referrals); + referrals = zend_try_array_init(referrals); + if (!referrals) { + return; + } + if (lreferrals != NULL) { refp = lreferrals; while (*refp) { @@ -4207,7 +4216,7 @@ PHP_FUNCTION(ldap_exop_passwd) int rc, myargcount = ZEND_NUM_ARGS(), msgid, err; char* errmsg; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|zzzt", &link, &user, &oldpw, &newpw, &serverctrls) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|zzzz", &link, &user, &oldpw, &newpw, &serverctrls) == FAILURE) { WRONG_PARAM_COUNT; } diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 72095e9d2c1c..884d1527aaea 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2133,14 +2133,15 @@ PHP_FUNCTION(mb_parse_str) const mbfl_encoding *detected; track_vars_array = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|t", &encstr, &encstr_len, &track_vars_array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z", &encstr, &encstr_len, &track_vars_array) == FAILURE) { return; } if (track_vars_array != NULL) { - /* Clear out the array */ - zval_dtor(track_vars_array); - array_init(track_vars_array); + track_vars_array = zend_try_array_init(track_vars_array); + if (!track_vars_array) { + return; + } } encstr = estrndup(encstr, encstr_len); diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c index a372aebc3afc..b7f4480025a7 100644 --- a/ext/mbstring/php_mbregex.c +++ b/ext/mbstring/php_mbregex.c @@ -696,13 +696,15 @@ static void _php_mb_regex_ereg_exec(INTERNAL_FUNCTION_PARAMETERS, int icase) OnigOptionType options; char *str; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs|t", &arg_pattern, &string, &string_len, &array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs|z", &arg_pattern, &string, &string_len, &array) == FAILURE) { RETURN_FALSE; } if (array != NULL) { - zval_dtor(array); - array_init(array); + array = zend_try_array_init(array); + if (!array) { + return; + } } if (!php_mb_check_encoding( diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index 140613ec5874..a29d2a1befb5 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1434,26 +1434,27 @@ PHP_FUNCTION(oci_fetch_all) int i; zend_long rows = 0, flags = 0, skip = 0, maxrows = -1; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rt|lll", &z_statement, &array, &skip, &maxrows, &flags) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz|lll", &z_statement, &array, &skip, &maxrows, &flags) == FAILURE) { return; } PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); - zval_ptr_dtor(array); - while (skip--) { if (php_oci_statement_fetch(statement, nrows)) { - array_init(array); + zend_try_array_init(array); RETURN_LONG(0); } } if (flags & PHP_OCI_FETCHSTATEMENT_BY_ROW) { /* Fetch by Row: array will contain one sub-array per query row */ - array_init(array); - columns = safe_emalloc(statement->ncolumns, sizeof(php_oci_out_column *), 0); + array = zend_try_array_init(array); + if (!array) { + return; + } + columns = safe_emalloc(statement->ncolumns, sizeof(php_oci_out_column *), 0); for (i = 0; i < statement->ncolumns; i++) { columns[ i ] = php_oci_statement_get_column(statement, i + 1, NULL, 0); } @@ -1488,7 +1489,11 @@ PHP_FUNCTION(oci_fetch_all) } else { /* default to BY_COLUMN */ /* Fetch by columns: array will contain one sub-array per query column */ - array_init_size(array, statement->ncolumns); + array = zend_try_array_init_size(array, statement->ncolumns); + if (!array) { + return; + } + columns = safe_emalloc(statement->ncolumns, sizeof(php_oci_out_column *), 0); outarrs = safe_emalloc(statement->ncolumns, sizeof(zval*), 0); diff --git a/ext/odbc/php_odbc.c b/ext/odbc/php_odbc.c index 198f5fce0702..e44c5b9564db 100644 --- a/ext/odbc/php_odbc.c +++ b/ext/odbc/php_odbc.c @@ -1880,13 +1880,13 @@ PHP_FUNCTION(odbc_fetch_into) #endif /* HAVE_SQL_EXTENDED_FETCH */ #ifdef HAVE_SQL_EXTENDED_FETCH - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rt|l", &pv_res, &pv_res_arr, &pv_row) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz|l", &pv_res, &pv_res_arr, &pv_row) == FAILURE) { return; } rownum = pv_row; #else - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rt", &pv_res, &pv_res_arr) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz", &pv_res, &pv_res_arr) == FAILURE) { return; } #endif /* HAVE_SQL_EXTENDED_FETCH */ @@ -1900,8 +1900,9 @@ PHP_FUNCTION(odbc_fetch_into) RETURN_FALSE; } - if (Z_TYPE_P(pv_res_arr) != IS_ARRAY) { - array_init(pv_res_arr); + pv_res_arr = zend_try_array_init(pv_res_arr); + if (!pv_res_arr) { + return; } #ifdef HAVE_SQL_EXTENDED_FETCH diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 1106f2afbe7c..8dbc54a51ebc 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -2959,7 +2959,7 @@ PHP_FUNCTION(openssl_pkcs12_read) BIO * bio_in = NULL; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sts", &zp12, &zp12_len, &zout, &pass, &pass_len) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szs", &zp12, &zp12_len, &zout, &pass, &pass_len) == FAILURE) return; RETVAL_FALSE; @@ -2977,8 +2977,10 @@ PHP_FUNCTION(openssl_pkcs12_read) BIO * bio_out; int cert_num; - zval_dtor(zout); - array_init(zout); + zout = zend_try_array_init(zout); + if (!zout) { + goto cleanup; + } if (cert) { bio_out = BIO_new(BIO_s_mem()); @@ -5342,7 +5344,7 @@ PHP_FUNCTION(openssl_pkcs7_read) PKCS7 * p7 = NULL; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "st", &p7b, &p7b_len, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz", &p7b, &p7b_len, &zout) == FAILURE) { return; } @@ -5384,8 +5386,10 @@ PHP_FUNCTION(openssl_pkcs7_read) break; } - zval_dtor(zout); - array_init(zout); + zout = zend_try_array_init(zout); + if (!zout) { + goto clean_exit; + } if (certs != NULL) { for (i = 0; i < sk_X509_num(certs); i++) { @@ -6058,7 +6062,7 @@ PHP_FUNCTION(openssl_seal) const EVP_CIPHER *cipher; EVP_CIPHER_CTX *ctx; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "szta|sz", &data, &data_len, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szza|sz", &data, &data_len, &sealdata, &ekeys, &pubkeys, &method, &method_len, &iv) == FAILURE) { return; } @@ -6135,8 +6139,12 @@ PHP_FUNCTION(openssl_seal) ZEND_TRY_ASSIGN_NEW_STR(sealdata, zend_string_init((char*)buf, len1 + len2, 0)); efree(buf); - zval_dtor(ekeys); - array_init(ekeys); + ekeys = zend_try_array_init(ekeys); + if (!ekeys) { + EVP_CIPHER_CTX_free(ctx); + goto clean_exit; + } + for (i=0; i 0 && user_siginfo) { - zval_dtor(user_siginfo); - array_init(user_siginfo); + user_siginfo = zend_try_array_init(user_siginfo); + if (!user_siginfo) { + return; + } add_assoc_long_ex(user_siginfo, "signo", sizeof("signo")-1, siginfo->si_signo); add_assoc_long_ex(user_siginfo, "errno", sizeof("errno")-1, siginfo->si_errno); diff --git a/ext/soap/soap.c b/ext/soap/soap.c index cf0542311d3e..43d6a1441b13 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -2812,7 +2812,7 @@ PHP_METHOD(SoapClient, __call) zend_bool free_soap_headers = 0; zval *this_ptr; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sa|a!zt", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sa|a!zz", &function, &function_len, &args, &options, &headers, &output_headers) == FAILURE) { return; } @@ -2884,14 +2884,18 @@ PHP_METHOD(SoapClient, __call) } ZEND_HASH_FOREACH_END(); } if (output_headers) { - zval_ptr_dtor(output_headers); - array_init(output_headers); + output_headers = zend_try_array_init(output_headers); + if (!output_headers) { + goto cleanup; + } } + do_soap_call(execute_data, this_ptr, function, function_len, arg_count, real_args, return_value, location, soap_action, uri, soap_headers, output_headers); + +cleanup: if (arg_count > 0) { efree(real_args); } - if (soap_headers && free_soap_headers) { zend_hash_destroy(soap_headers); efree(soap_headers); diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index c3e1e64dab55..ddc756d5d70b 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -2214,7 +2214,7 @@ PHP_FUNCTION(socket_create_pair) PHP_SOCKET fds_array[2]; zend_long domain, type, protocol; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "lllt", &domain, &type, &protocol, &fds_array_zval) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "lllz", &domain, &type, &protocol, &fds_array_zval) == FAILURE) { return; } @@ -2243,8 +2243,12 @@ PHP_FUNCTION(socket_create_pair) RETURN_FALSE; } - zval_ptr_dtor(fds_array_zval); - array_init(fds_array_zval); + fds_array_zval = zend_try_array_init(fds_array_zval); + if (!fds_array_zval) { + efree(php_sock[0]); + efree(php_sock[1]); + return; + } php_sock[0]->bsd_socket = fds_array[0]; php_sock[1]->bsd_socket = fds_array[1]; diff --git a/ext/standard/dns_win32.c b/ext/standard/dns_win32.c index 3e3930af57d8..dbd5b743add1 100644 --- a/ext/standard/dns_win32.c +++ b/ext/standard/dns_win32.c @@ -50,7 +50,7 @@ PHP_FUNCTION(dns_get_mx) /* {{{ */ DNS_STATUS status; /* Return value of DnsQuery_A() function */ PDNS_RECORD pResult, pRec; /* Pointer to DNS_RECORD structure */ - if (zend_parse_parameters(ZEND_NUM_ARGS(), "st|t", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz|z", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { return; } @@ -60,12 +60,16 @@ PHP_FUNCTION(dns_get_mx) /* {{{ */ RETURN_FALSE; } - zval_dtor(mx_list); - array_init(mx_list); + mx_list = zend_try_array_init(mx_list); + if (!mx_list) { + goto cleanup; + } if (weight_list) { - zval_dtor(weight_list); - array_init(weight_list); + weight_list = zend_try_array_init(weight_list); + if (!weight_list) { + goto cleanup; + } } for (pRec = pResult; pRec; pRec = pRec->pNext) { @@ -81,6 +85,7 @@ PHP_FUNCTION(dns_get_mx) /* {{{ */ } } +cleanup: /* Free memory allocated for DNS records. */ DnsRecordListFree(pResult, DnsFreeRecordListDeep); @@ -352,18 +357,22 @@ PHP_FUNCTION(dns_get_record) int type, type_to_fetch, first_query = 1, store_results = 1; zend_bool raw = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lt!t!b", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lz!z!b", &hostname, &hostname_len, &type_param, &authns, &addtl, &raw) == FAILURE) { return; } if (authns) { - zval_dtor(authns); - array_init(authns); + authns = zend_try_array_init(authns); + if (!authns) { + return; + } } if (addtl) { - zval_dtor(addtl); - array_init(addtl); + addtl = zend_try_array_init(addtl); + if (!addtl) { + return; + } } if (!raw) { diff --git a/ext/xml/xml.c b/ext/xml/xml.c index e982002e3277..b0c4107a68ad 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -1411,21 +1411,25 @@ PHP_FUNCTION(xml_parse_into_struct) size_t data_len; int ret; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rst|t", &pind, &data, &data_len, &xdata, &info) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsz|z", &pind, &data, &data_len, &xdata, &info) == FAILURE) { return; } if (info) { - zval_ptr_dtor(info); - array_init(info); + info = zend_try_array_init(info); + if (!info) { + return; + } } if ((parser = (xml_parser *)zend_fetch_resource(Z_RES_P(pind), "XML Parser", le_xml_parser)) == NULL) { RETURN_FALSE; } - zval_ptr_dtor(xdata); - array_init(xdata); + xdata = zend_try_array_init(xdata); + if (!xdata) { + return; + } ZVAL_COPY_VALUE(&parser->data, xdata); From d35b33808688f4439ee23939e87c27b86b7bab71 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 3 Jul 2018 21:35:19 +0200 Subject: [PATCH 284/369] Drop ARRAY_ASSIGNABLE as well --- Zend/zend_API.h | 13 ------------- ext/pcre/php_pcre.c | 8 +++++--- ext/standard/dns.c | 32 ++++++++++++++++++++------------ ext/standard/exec.c | 17 ++++++++++------- ext/standard/image.c | 8 +++++--- ext/standard/proc_open.c | 10 ++++++---- ext/standard/string.c | 10 ++++++---- 7 files changed, 52 insertions(+), 46 deletions(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index c6308cf4f3c7..7eead233bec6 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -1206,19 +1206,6 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha #define Z_PARAM_STR(dest) \ Z_PARAM_STR_EX(dest, 0, 0) -/* old "t" */ -#define Z_PARAM_ARRAY_ASSIGNABLE_EX(dest, check_null, separate) \ - Z_PARAM_PROLOGUE(1, separate); \ - if (Z_ISREF_P(_real_arg) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(_real_arg)) && zend_verify_ref_assignable_type(Z_REF_P(_real_arg), ZEND_TYPE_ENCODE(IS_ARRAY, 0)) != NULL) { \ - _expected_type = Z_EXPECTED_ARRAY; \ - error_code = ZPP_ERROR_WRONG_ARG; \ - break; \ - } \ - zend_parse_arg_zval_deref(_arg, &dest, check_null); - -#define Z_PARAM_ARRAY_ASSIGNABLE(dest) \ - Z_PARAM_ARRAY_ASSIGNABLE_EX(dest, 0, 0) - /* old "z" */ #define Z_PARAM_ZVAL_EX2(dest, check_null, deref, separate) \ Z_PARAM_PROLOGUE(deref, separate); \ diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index 1a395591e96e..44e863ba22be 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -949,7 +949,7 @@ static void php_do_pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global) /* {{{ * Z_PARAM_STR(regex) Z_PARAM_STR(subject) Z_PARAM_OPTIONAL - Z_PARAM_ARRAY_ASSIGNABLE(subpats) + Z_PARAM_ZVAL(subpats) Z_PARAM_LONG(flags) Z_PARAM_LONG(start_offset) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); @@ -994,8 +994,10 @@ PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, char *subject, size_t sub /* Overwrite the passed-in value for subpatterns with an empty array. */ if (subpats != NULL) { - zval_ptr_dtor(subpats); - array_init(subpats); + subpats = zend_try_array_init(subpats); + if (!subpats) { + return; + } } subpats_order = global ? PREG_PATTERN_ORDER : 0; diff --git a/ext/standard/dns.c b/ext/standard/dns.c index 6800fc36f350..29d51916a1c3 100644 --- a/ext/standard/dns.c +++ b/ext/standard/dns.c @@ -811,18 +811,22 @@ PHP_FUNCTION(dns_get_record) Z_PARAM_STRING(hostname, hostname_len) Z_PARAM_OPTIONAL Z_PARAM_LONG(type_param) - Z_PARAM_ARRAY_ASSIGNABLE(authns) - Z_PARAM_ARRAY_ASSIGNABLE(addtl) + Z_PARAM_ZVAL(authns) + Z_PARAM_ZVAL(addtl) Z_PARAM_BOOL(raw) ZEND_PARSE_PARAMETERS_END(); if (authns) { - zval_ptr_dtor(authns); - array_init(authns); + authns = zend_try_array_init(authns); + if (!authns) { + return; + } } if (addtl) { - zval_ptr_dtor(addtl); - array_init(addtl); + addtl = zend_try_array_init(addtl); + if (!addtl) { + return; + } } if (!raw) { @@ -1044,17 +1048,21 @@ PHP_FUNCTION(dns_get_mx) ZEND_PARSE_PARAMETERS_START(2, 3) Z_PARAM_STRING(hostname, hostname_len) - Z_PARAM_ARRAY_ASSIGNABLE(mx_list) + Z_PARAM_ZVAL(mx_list) Z_PARAM_OPTIONAL - Z_PARAM_ARRAY_ASSIGNABLE(weight_list) + Z_PARAM_ZVAL(weight_list) ZEND_PARSE_PARAMETERS_END(); - zval_ptr_dtor(mx_list); - array_init(mx_list); + mx_list = zend_try_array_init(mx_list); + if (!mx_list) { + return; + } if (weight_list) { - zval_ptr_dtor(weight_list); - array_init(weight_list); + weight_list = zend_try_array_init(weight_list); + if (!weight_list) { + return; + } } #if defined(HAVE_DNS_SEARCH) diff --git a/ext/standard/exec.c b/ext/standard/exec.c index 379be2f2cf50..e0c0cf44f011 100644 --- a/ext/standard/exec.c +++ b/ext/standard/exec.c @@ -217,7 +217,7 @@ static void php_exec_ex(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */ Z_PARAM_STRING(cmd, cmd_len) Z_PARAM_OPTIONAL if (!mode) { - Z_PARAM_ARRAY_ASSIGNABLE_EX(ret_array, 0, 1) + Z_PARAM_ZVAL(ret_array) } Z_PARAM_ZVAL(ret_code) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); @@ -234,13 +234,16 @@ static void php_exec_ex(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */ if (!ret_array) { ret = php_exec(mode, cmd, NULL, return_value); } else { - if (Z_TYPE_P(ret_array) != IS_ARRAY) { - zval_ptr_dtor(ret_array); - array_init(ret_array); - } else if (Z_REFCOUNT_P(ret_array) > 1) { - zval_ptr_dtor(ret_array); - ZVAL_ARR(ret_array, zend_array_dup(Z_ARR_P(ret_array))); + if (Z_TYPE_P(Z_REFVAL_P(ret_array)) == IS_ARRAY) { + ZVAL_DEREF(ret_array); + SEPARATE_ARRAY(ret_array); + } else { + ret_array = zend_try_array_init(ret_array); + if (!ret_array) { + return; + } } + ret = php_exec(2, cmd, ret_array, return_value); } if (ret_code) { diff --git a/ext/standard/image.c b/ext/standard/image.c index f6b605b4d7e5..7dfad5ae9d42 100644 --- a/ext/standard/image.c +++ b/ext/standard/image.c @@ -1475,12 +1475,14 @@ static void php_getimagesize_from_any(INTERNAL_FUNCTION_PARAMETERS, int mode) { ZEND_PARSE_PARAMETERS_START(1, 2) Z_PARAM_STRING(input, input_len) Z_PARAM_OPTIONAL - Z_PARAM_ARRAY_ASSIGNABLE(info) + Z_PARAM_ZVAL(info) ZEND_PARSE_PARAMETERS_END(); if (argc == 2) { - zval_ptr_dtor(info); - array_init(info); + info = zend_try_array_init(info); + if (!info) { + return; + } } if (mode == FROM_PATH) { diff --git a/ext/standard/proc_open.c b/ext/standard/proc_open.c index ffa7fd768927..a96ab09e572c 100644 --- a/ext/standard/proc_open.c +++ b/ext/standard/proc_open.c @@ -448,7 +448,7 @@ PHP_FUNCTION(proc_open) ZEND_PARSE_PARAMETERS_START(3, 6) Z_PARAM_STRING(command, command_len) Z_PARAM_ARRAY(descriptorspec) - Z_PARAM_ARRAY_ASSIGNABLE(pipes) + Z_PARAM_ZVAL(pipes) Z_PARAM_OPTIONAL Z_PARAM_STRING_EX(cwd, cwd_len, 1, 0) Z_PARAM_ARRAY_EX(environment, 1, 0) @@ -863,6 +863,11 @@ PHP_FUNCTION(proc_open) #endif /* we forked/spawned and this is the parent */ + pipes = zend_try_array_init(pipes); + if (!pipes) { + goto exit_fail; + } + proc = (struct php_process_handle*)pemalloc(sizeof(struct php_process_handle), is_persistent); proc->is_persistent = is_persistent; proc->command = command; @@ -874,9 +879,6 @@ PHP_FUNCTION(proc_open) #endif proc->env = env; - zval_ptr_dtor(pipes); - array_init(pipes); - #if PHP_CAN_DO_PTS if (dev_ptmx >= 0) { close(dev_ptmx); diff --git a/ext/standard/string.c b/ext/standard/string.c index 41d2ad2c7ff1..e5f3c189ffb6 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -4870,7 +4870,7 @@ PHP_FUNCTION(parse_str) ZEND_PARSE_PARAMETERS_START(1, 2) Z_PARAM_STRING(arg, arglen) Z_PARAM_OPTIONAL - Z_PARAM_ARRAY_ASSIGNABLE(arrayArg) + Z_PARAM_ZVAL(arrayArg) ZEND_PARSE_PARAMETERS_END(); res = estrndup(arg, arglen); @@ -4892,9 +4892,11 @@ PHP_FUNCTION(parse_str) zend_throw_error(NULL, "Cannot re-assign $this"); } } else { - /* Clear out the array that was passed in. */ - zval_ptr_dtor(arrayArg); - array_init(arrayArg); + arrayArg = zend_try_array_init(arrayArg); + if (!arrayArg) { + return; + } + sapi_module.treat_data(PARSE_STRING, res, arrayArg); } } From 3bfbbf840d8ce36ffed90be9edc96a273247e1db Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 4 Jul 2018 11:00:10 +0200 Subject: [PATCH 285/369] Abort early on exception in extract() In line with upstream. Also remove silent parameter from zend_try_assign_ex(). --- Zend/zend_API.h | 8 ++--- ext/standard/array.c | 34 +++++++++---------- .../tests/array/extract_typed_ref.phpt | 2 +- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 7eead233bec6..1953ca727e67 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -678,7 +678,7 @@ END_EXTERN_C() #define ZEND_GINIT_FUNCTION ZEND_MODULE_GLOBALS_CTOR_D #define ZEND_GSHUTDOWN_FUNCTION ZEND_MODULE_GLOBALS_DTOR_D -static zend_always_inline int zend_try_assign_ex(zval *zv, zval *arg, zend_bool silent, zend_bool strict) { +static zend_always_inline int zend_try_assign_ex(zval *zv, zval *arg, zend_bool strict) { zend_reference *ref; if (EXPECTED(Z_ISREF_P(zv)) && UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref = Z_REF_P(zv)))) { zend_property_info *error_prop; @@ -689,9 +689,7 @@ static zend_always_inline int zend_try_assign_ex(zval *zv, zval *arg, zend_bool zval_ptr_dtor(zv); ZVAL_COPY_VALUE(zv, &tmp); } else { - if (!silent) { - zend_throw_ref_type_error_zval(error_prop, &tmp); - } + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); return FAILURE; } @@ -705,7 +703,7 @@ static zend_always_inline int zend_try_assign_ex(zval *zv, zval *arg, zend_bool } static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { - return zend_try_assign_ex(zv, arg, 0, ZEND_ARG_USES_STRICT_TYPES()); + return zend_try_assign_ex(zv, arg, ZEND_ARG_USES_STRICT_TYPES()); } #define ZEND_TRY_ASSIGN_NULL(zv) do { \ diff --git a/ext/standard/array.c b/ext/standard/array.c index 03d628acdf00..d892721d85b7 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1801,9 +1801,8 @@ static zend_long php_extract_if_exists(zend_array *arr, zend_array *symbol_table } ZVAL_DEREF(entry); Z_TRY_ADDREF_P(entry); - if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { - exception_thrown = 1; - continue; + if (zend_try_assign_ex(orig_var, entry, 0) == FAILURE) { + return -1; } count++; } @@ -1887,9 +1886,8 @@ static zend_long php_extract_overwrite(zend_array *arr, zend_array *symbol_table } ZVAL_DEREF(entry); Z_TRY_ADDREF_P(entry); - if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { - exception_thrown = 1; - continue; + if (zend_try_assign_ex(orig_var, entry, 0) == FAILURE) { + return -1; } } else { ZVAL_DEREF(entry); @@ -1992,9 +1990,9 @@ static zend_long php_extract_prefix_if_exists(zend_array *arr, zend_array *symbo orig_var = Z_INDIRECT_P(orig_var); } Z_TRY_ADDREF_P(entry); - if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { - exception_thrown = 1; - continue; + if (zend_try_assign_ex(orig_var, entry, 0) == FAILURE) { + zend_string_release_ex(Z_STR(final_name), 0); + return -1; } } else { Z_TRY_ADDREF_P(entry); @@ -2121,9 +2119,9 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab orig_var = Z_INDIRECT_P(orig_var); } Z_TRY_ADDREF_P(entry); - if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { - exception_thrown = 1; - continue; + if (zend_try_assign_ex(orig_var, entry, 0) == FAILURE) { + zend_string_release_ex(Z_STR(final_name), 0); + return -1; } } else { Z_TRY_ADDREF_P(entry); @@ -2228,9 +2226,9 @@ static zend_long php_extract_prefix_all(zend_array *arr, zend_array *symbol_tabl orig_var = Z_INDIRECT_P(orig_var); } Z_TRY_ADDREF_P(entry); - if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { - exception_thrown = 1; - continue; + if (zend_try_assign_ex(orig_var, entry, 0) == FAILURE) { + zend_string_release_ex(Z_STR(final_name), 0); + return -1; } } else { Z_TRY_ADDREF_P(entry); @@ -2337,9 +2335,9 @@ static zend_long php_extract_prefix_invalid(zend_array *arr, zend_array *symbol_ orig_var = Z_INDIRECT_P(orig_var); } Z_TRY_ADDREF_P(entry); - if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { - exception_thrown = 1; - continue; + if (zend_try_assign_ex(orig_var, entry, 0) == FAILURE) { + zend_string_release_ex(Z_STR(final_name), 0); + return -1; } } else { Z_TRY_ADDREF_P(entry); diff --git a/ext/standard/tests/array/extract_typed_ref.phpt b/ext/standard/tests/array/extract_typed_ref.phpt index f480a410946b..8eac12945f48 100644 --- a/ext/standard/tests/array/extract_typed_ref.phpt +++ b/ext/standard/tests/array/extract_typed_ref.phpt @@ -20,4 +20,4 @@ var_dump($test->i, $test->s); --EXPECT-- Cannot assign string to reference held by property Test->i of type int int(0) -string(2) "42" +string(0) "" From acd013c8f70cb157d6575fd945c0344d03271cdb Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 4 Jul 2018 11:02:53 +0200 Subject: [PATCH 286/369] Move throwing of error into verify_ref_assignable_zval() --- Zend/zend_API.h | 4 +- Zend/zend_execute.c | 25 ++-- Zend/zend_execute.h | 6 +- Zend/zend_vm_def.h | 36 ++--- Zend/zend_vm_execute.h | 230 ++++++++++---------------------- ext/reflection/php_reflection.c | 4 +- 6 files changed, 92 insertions(+), 213 deletions(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 1953ca727e67..7840298e6d65 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -681,15 +681,13 @@ END_EXTERN_C() static zend_always_inline int zend_try_assign_ex(zval *zv, zval *arg, zend_bool strict) { zend_reference *ref; if (EXPECTED(Z_ISREF_P(zv)) && UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref = Z_REF_P(zv)))) { - zend_property_info *error_prop; zval tmp; ZVAL_COPY_VALUE(&tmp, arg); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, strict)) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, strict))) { zv = Z_REFVAL_P(zv); zval_ptr_dtor(zv); ZVAL_COPY_VALUE(zv, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); return FAILURE; } diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index f69346aaede0..da1477776f41 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1297,12 +1297,10 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval * ZVAL_COPY_VALUE(z, value); } if (UNEXPECTED(Z_ISREF_P(z))) { - zend_property_info *error_prop; zend_reference *ref = Z_REF_P(z); zval *refval = Z_REFVAL_P(z); binary_op(&res, refval, value); - if (ZEND_REF_HAS_TYPE_SOURCES(ref) && (error_prop = zend_verify_ref_assignable_zval(ref, &res, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) != NULL) { - zend_throw_ref_type_error_zval(error_prop, &res); + if (ZEND_REF_HAS_TYPE_SOURCES(ref) && !zend_verify_ref_assignable_zval(ref, &res, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { zval_ptr_dtor(&res); if (z == &rv) { zval_ptr_dtor(&rv); @@ -1632,13 +1630,11 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i } else { decrement_function(&z_copy); } - if (EXPECTED(ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -1702,13 +1698,11 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ } else { decrement_function(&z_copy); } - if (EXPECTED(ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -2838,19 +2832,20 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, ); } -static zend_always_inline zend_property_info *i_zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict) { +static zend_always_inline zend_bool i_zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict) { zend_property_info *prop; ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { if (!i_zend_verify_type_assignable_zval(prop->type, zv, strict)) { - return prop; + zend_throw_ref_type_error_zval(prop, zv); + return 0; } } ZEND_REF_FOREACH_TYPE_SOURCES_END(); - return NULL; + return 1; } -ZEND_API zend_property_info *zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict) +ZEND_API zend_bool zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict) { return i_zend_verify_ref_assignable_zval(ref, zv, strict); } diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 1f4dee0ce5e6..9c1c3fa3f98e 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -86,7 +86,7 @@ static zend_always_inline zend_bool zend_verify_type_assignable(zend_type type, } ZEND_API zend_property_info *zend_verify_ref_assignable_type(zend_reference *ref, zend_type type); -ZEND_API zend_property_info *zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict); +ZEND_API zend_bool zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, 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(const char *source, zend_property_info *prop, zend_type type); @@ -116,14 +116,12 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval if (Z_ISREF_P(variable_ptr)) { if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) { - zend_property_info *error_prop; zend_bool need_copy = (value_type & (IS_CONST|IS_CV)) || ((value_type & IS_VAR) && UNEXPECTED(ref) && Z_REFCOUNT_P(variable_ptr) > 1); if (need_copy) { ZVAL_COPY(&tmp, value); value = &tmp; } - if ((error_prop = zend_verify_ref_assignable_zval(Z_REF_P(variable_ptr), value, strict)) != NULL) { - zend_throw_ref_type_error_zval(error_prop, value); + if (!zend_verify_ref_assignable_zval(Z_REF_P(variable_ptr), value, strict)) { zval_ptr_dtor(value); return Z_REFVAL_P(variable_ptr); } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index e653cfa43678..d9051b1b637d 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -854,13 +854,11 @@ ZEND_VM_C_LABEL(assign_op_object): zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -922,13 +920,11 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -984,14 +980,12 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array): zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP2(); FREE_OP(free_op_data1); @@ -1085,15 +1079,13 @@ ZEND_VM_HELPER(zend_binary_assign_op_simple_helper, VAR|CV, CONST|TMPVAR|CV, bin } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); } else { @@ -1436,15 +1428,13 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); FREE_OP1_VAR_PTR(); @@ -1500,15 +1490,13 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); FREE_OP1_VAR_PTR(); @@ -1534,7 +1522,6 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_property_info *error_prop; zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1564,8 +1551,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) increment_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -1579,7 +1565,6 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_property_info *error_prop; zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1609,8 +1594,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) decrement_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 0b96c0217eb7..16bc34a8e177 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4586,13 +4586,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -7176,13 +7174,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -9059,13 +9055,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -20291,13 +20285,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -20859,13 +20851,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -21560,13 +21550,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -22533,15 +22521,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22597,15 +22583,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22661,15 +22645,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22725,15 +22707,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22759,7 +22739,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_property_info *error_prop; zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22789,8 +22768,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND increment_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -22804,7 +22782,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_property_info *error_prop; zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22834,8 +22811,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND decrement_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -24309,13 +24285,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -24377,13 +24351,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -24439,14 +24411,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -24539,15 +24509,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); } else { @@ -27194,13 +27162,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -27262,13 +27228,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -27324,14 +27288,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); zval_ptr_dtor_nogc(free_op2); FREE_OP(free_op_data1); @@ -27425,15 +27387,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); } else { @@ -30262,13 +30222,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -30324,14 +30282,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -31763,13 +31719,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -31832,14 +31786,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -31932,15 +31884,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); } else { @@ -34723,13 +34673,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -36800,13 +36748,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -39509,13 +39455,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -41491,15 +41435,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); @@ -41554,15 +41496,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); @@ -41617,15 +41557,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); @@ -41680,15 +41618,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); @@ -41713,7 +41649,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr; - zend_property_info *error_prop; zend_reference *ref = NULL; var_ptr = EX_VAR(opline->op1.var); @@ -41743,8 +41678,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ increment_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -41757,7 +41691,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr; - zend_property_info *error_prop; zend_reference *ref = NULL; var_ptr = EX_VAR(opline->op1.var); @@ -41787,8 +41720,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ decrement_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -43917,13 +43849,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -43985,13 +43915,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -44047,14 +43975,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -44147,15 +44073,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); } else { @@ -48605,13 +48529,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -48673,13 +48595,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -48735,14 +48655,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); zval_ptr_dtor_nogc(free_op2); FREE_OP(free_op_data1); @@ -48836,15 +48754,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); } else { @@ -52664,13 +52580,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -52726,14 +52640,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -55413,13 +55325,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -55482,14 +55392,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -55582,15 +55490,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); } else { diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index b394846a9c50..d5881c7b2a52 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3948,12 +3948,10 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) } if (Z_ISREF_P(variable_ptr)) { - zend_property_info *error_prop; zend_reference *ref = Z_REF_P(variable_ptr); variable_ptr = Z_REFVAL_P(variable_ptr); - if ((error_prop = zend_verify_ref_assignable_zval(ref, value, 0)) != NULL) { - zend_throw_ref_type_error_zval(error_prop, value); + if (!zend_verify_ref_assignable_zval(ref, value, 0)) { return; } } From a10222ecf75c46ec973f9cca3ce2b8133d131a4a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 3 Jul 2018 21:51:57 +0200 Subject: [PATCH 287/369] Don't constrain type intersections This allows intersecting ?int and ?string with value null, and is conceptually forward-compatible with union types, at which point we must deal with the problem of conflicting coercive types anyway. Implemented in a way that only performs type coercion (if necessary) once. --- .../typed_properties_068.phpt | 4 +- .../typed_properties_076.phpt | 3 +- .../typed_properties_078.phpt | 2 +- Zend/zend_execute.c | 254 ++++--- Zend/zend_execute.h | 30 +- Zend/zend_object_handlers.c | 17 +- Zend/zend_vm_def.h | 44 +- Zend/zend_vm_execute.h | 649 +++--------------- 8 files changed, 286 insertions(+), 717 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_068.phpt b/Zend/tests/type_declarations/typed_properties_068.phpt index 97deab9c570a..508e079a94fb 100644 --- a/Zend/tests/type_declarations/typed_properties_068.phpt +++ b/Zend/tests/type_declarations/typed_properties_068.phpt @@ -94,9 +94,9 @@ string(1) "0" Typed property Foo::$i must be int, string used int(0) string(1) "x" -Static property type int is not compatible with the reference held by property Foo::$s of type string +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" -Static property type string is not compatible with the reference held by property Foo::$i of type int +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_076.phpt b/Zend/tests/type_declarations/typed_properties_076.phpt index 93a8585cdd8b..b0d0bfedf808 100644 --- a/Zend/tests/type_declarations/typed_properties_076.phpt +++ b/Zend/tests/type_declarations/typed_properties_076.phpt @@ -51,7 +51,8 @@ $test = new Test; invalid($test, 'int', 'float', 42.0); valid($test, 'int', 'nint', 42); invalid($test, 'int', 'nint', null); -invalid($test, 'nint', 'nstring', 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); diff --git a/Zend/tests/type_declarations/typed_properties_078.phpt b/Zend/tests/type_declarations/typed_properties_078.phpt index 3ceb77f91c84..52c1ffccbe55 100644 --- a/Zend/tests/type_declarations/typed_properties_078.phpt +++ b/Zend/tests/type_declarations/typed_properties_078.phpt @@ -45,7 +45,7 @@ var_dump($ref instanceof ArrayIterator); --EXPECT-- array(0) { } -string(114) "Property type ?Traversable is not compatible with the reference held by property class@anonymous->a of type ?array" +string(89) "Typed property class@anonymous::$t must be an instance of Traversable or null, array used" array(0) { } array(1) { diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index da1477776f41..9f22784e7b60 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -994,35 +994,6 @@ zval* zend_verify_property_type(zend_property_info *info, zval *property, zval * return i_zend_verify_property_type(info, property, tmp, strict); } -static zend_always_inline zend_bool i_zend_verify_type_assignable_zval(zend_type type, zval *zv, zend_bool strict) { - zend_uchar cur_type; - - if (!ZEND_TYPE_IS_SET(type)) { - return 1; - } - ZVAL_DEREF(zv); - - if (zend_verify_type_assignable(type, Z_TYPE_P(zv))) { - return 1; - } - - if (ZEND_TYPE_IS_CLASS(type)) { - return Z_TYPE_P(zv) == IS_OBJECT && instanceof_function(Z_OBJCE_P(zv), ZEND_TYPE_CE(type)); - } - - cur_type = ZEND_TYPE_CODE(type); - if (cur_type == IS_ITERABLE) { - return zend_is_iterable(zv); - } - - return zend_verify_scalar_type_hint(cur_type, zv, zv, strict); -} - -ZEND_API zend_bool zend_verify_type_assignable_zval(zend_type type, zval *zv, zend_bool strict) -{ - return i_zend_verify_type_assignable_zval(type, zv, strict); -} - static zend_always_inline zend_bool zend_check_type( zend_type type, zval *arg, zend_class_entry **ce, void **cache_slot, @@ -2189,7 +2160,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) { if (type != BP_VAR_UNSET) { zend_property_info *error_prop; - if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_container), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_container))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); } else { @@ -2735,87 +2706,44 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, return SUCCESS; } -/* detects impossible intersections of types */ -static zend_always_inline zend_property_info *i_zend_verify_ref_assignable_type(zend_reference *ref, zend_type type) { +/* Checks whether an array can be assigned to the reference. Returns conflicting property if + * assignment is not possible, NULL otherwise. */ +static zend_always_inline zend_property_info *i_zend_check_ref_array_assignable(zend_reference *ref) { zend_property_info *prop; - if (!ZEND_REF_HAS_TYPE_SOURCES(ref)) { return NULL; } - if (ZEND_TYPE_IS_CLASS(type)) { - /* interfaces can be intersected with any other interface, object and iterable; classes must be */ - ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { - zend_type prop_type = prop->type; - if (ZEND_TYPE_IS_CLASS(prop_type)) { - if ((!(ZEND_TYPE_CE(type)->ce_flags & ZEND_ACC_INTERFACE) || !(ZEND_TYPE_CE(prop_type)->ce_flags & ZEND_ACC_INTERFACE)) - && !instanceof_function(ZEND_TYPE_CE(prop_type), ZEND_TYPE_CE(type)) && !instanceof_function(ZEND_TYPE_CE(type), ZEND_TYPE_CE(prop_type))) { - return prop; - } - } else if (ZEND_TYPE_CODE(prop_type) != IS_OBJECT && (ZEND_TYPE_CODE(prop_type) != IS_ITERABLE || (!(ZEND_TYPE_CE(type)->ce_flags & ZEND_ACC_INTERFACE) && !instanceof_function(ZEND_TYPE_CE(type), zend_ce_traversable)))) { - return prop; - } - } ZEND_REF_FOREACH_TYPE_SOURCES_END(); - } else { - switch (ZEND_TYPE_CODE(type)) { - case IS_OBJECT: - ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { - if (!ZEND_TYPE_IS_CLASS(prop->type) && ZEND_TYPE_CODE(prop->type) != IS_OBJECT && ZEND_TYPE_CODE(prop->type) != IS_ITERABLE) { - return prop; - } - } ZEND_REF_FOREACH_TYPE_SOURCES_END(); - return NULL; - - case IS_ARRAY: - ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { - if (ZEND_TYPE_IS_CLASS(prop->type) || (ZEND_TYPE_CODE(prop->type) != IS_ITERABLE && ZEND_TYPE_CODE(prop->type) != IS_ARRAY)) { - return prop; - } - } ZEND_REF_FOREACH_TYPE_SOURCES_END(); - return NULL; - - case IS_ITERABLE: - ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { - if (ZEND_TYPE_IS_CLASS(prop->type) ? !(ZEND_TYPE_CE(prop->type)->ce_flags & ZEND_ACC_INTERFACE) && !instanceof_function(ZEND_TYPE_CE(prop->type), zend_ce_traversable) : (ZEND_TYPE_CODE(prop->type) != IS_ITERABLE && ZEND_TYPE_CODE(prop->type) != IS_ARRAY && ZEND_TYPE_CODE(prop->type) != IS_OBJECT)) { - return prop; - } - } ZEND_REF_FOREACH_TYPE_SOURCES_END(); - return NULL; - - case _IS_BOOL: - case IS_LONG: - case IS_DOUBLE: - case IS_STRING: - ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { - if (ZEND_TYPE_WITHOUT_NULL(prop->type) == ZEND_TYPE_WITHOUT_NULL(type)) { - return NULL; - } - return prop; - } ZEND_REF_FOREACH_TYPE_SOURCES_END(); - /* break intentionally missing */ - default: - ZEND_ASSERT(0); + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (ZEND_TYPE_IS_CLASS(prop->type) || (ZEND_TYPE_CODE(prop->type) != IS_ITERABLE && ZEND_TYPE_CODE(prop->type) != IS_ARRAY)) { + return prop; } - } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); return NULL; } -ZEND_API zend_property_info *zend_verify_ref_assignable_type(zend_reference *ref, zend_type type) { - return i_zend_verify_ref_assignable_type(ref, type); +ZEND_API zend_property_info *zend_check_ref_array_assignable(zend_reference *ref) { + return i_zend_check_ref_array_assignable(ref); } -ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(const char *source, zend_property_info *prop, zend_type type) { +ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1, zend_property_info *prop2, zval *zv) { + const char *class_name1, *class_name2, *prop_name1, *prop_name2; + zend_unmangle_property_name_ex(prop1->name, &class_name1, &prop_name1, NULL); + zend_unmangle_property_name_ex(prop2->name, &class_name2, &prop_name2, NULL); zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop->type), - "%s type %s%s is not compatible with the reference held by property %s%s%s of type %s%s", - source, - ZEND_TYPE_ALLOW_NULL(type) ? "?" : "", - ZEND_TYPE_IS_CLASS(type) ? ZSTR_VAL(ZEND_TYPE_CE(type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(type)), - ZSTR_VAL(prop->ce->name), - (prop->flags & ZEND_ACC_STATIC) ? "::$" : "->", - ZSTR_VAL(prop->name), - ZEND_TYPE_ALLOW_NULL(prop->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop->type)) + zend_ce_type_error, 0, + "Reference with value of type %s held by property %s%s%s of type %s%s is not compatible with property %s%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), + (prop1->flags & ZEND_ACC_STATIC) ? "::$" : "->", + prop_name1, + ZEND_TYPE_ALLOW_NULL(prop1->type) ? "?" : "", + ZEND_TYPE_IS_CLASS(prop1->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop1->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop1->type)), + ZSTR_VAL(prop2->ce->name), + (prop2->flags & ZEND_ACC_STATIC) ? "::$" : "->", + prop_name2, + ZEND_TYPE_ALLOW_NULL(prop2->type) ? "?" : "", + ZEND_TYPE_IS_CLASS(prop2->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop2->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop2->type)) ); } @@ -2832,16 +2760,108 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, ); } +ZEND_API ZEND_COLD void zend_throw_conflicting_coercion_error( + zend_property_info *prop1, zend_property_info *prop2, zval *zv) { + zend_throw_exception_ex( + zend_ce_type_error, 0, + "Cannot assign %s to reference held by property %s%s%s of type %s%s and property %s%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), + (prop1->flags & ZEND_ACC_STATIC) ? "::$" : "->", + ZSTR_VAL(prop1->name), + ZEND_TYPE_ALLOW_NULL(prop1->type) ? "?" : "", + ZEND_TYPE_IS_CLASS(prop1->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop1->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop1->type)), + ZSTR_VAL(prop2->ce->name), + (prop2->flags & ZEND_ACC_STATIC) ? "::$" : "->", + ZSTR_VAL(prop2->name), + ZEND_TYPE_ALLOW_NULL(prop2->type) ? "?" : "", + ZEND_TYPE_IS_CLASS(prop2->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop2->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop2->type)) + ); +} + +/* 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, zval *zv, zend_bool strict) { + zend_uchar type_code; + zend_uchar zv_type = Z_TYPE_P(zv); + + if (ZEND_TYPE_IS_CLASS(type)) { + return (zv_type == IS_OBJECT && instanceof_function(Z_OBJCE_P(zv), ZEND_TYPE_CE(type))) + || (ZEND_TYPE_ALLOW_NULL(type) && zv_type == IS_NULL); + } + + type_code = ZEND_TYPE_CODE(type); + if (type_code == zv_type || + (ZEND_TYPE_ALLOW_NULL(type) && zv_type == IS_NULL) || + (type_code == _IS_BOOL && (zv_type == IS_FALSE || zv_type == IS_TRUE))) { + return 1; + } + + if (type_code == IS_ITERABLE) { + return zend_is_iterable(zv); + } + + /* No weak conversions for arrays and objects */ + if (type_code == IS_ARRAY || type_code == IS_OBJECT) { + return 0; + } + + if (strict) { + /* SSTH Exception: IS_LONG may be accepted as IS_DOUBLE (converted) */ + if (type_code != IS_DOUBLE || Z_TYPE_P(zv) != IS_LONG) { + return 0; + } + } else if (Z_TYPE_P(zv) == IS_NULL) { + /* NULL may be accepted only by nullable hints (this is already checked) */ + return 0; + } + + /* Coercion may be necessary, check separately */ + return -1; +} + static zend_always_inline zend_bool i_zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict) { zend_property_info *prop; + /* The value must satisfy each property type, and coerce to the same value for each property + * type. Right now, the latter rule means that *if* coercion is necessary, then all types + * must be the same (modulo nullability). To handle this, remember the first type we see and + * compare against it when coercion becomes necessary. */ + zend_property_info *seen_prop = NULL; + zend_uchar seen_type; + zend_bool needs_coercion = 0; + + ZEND_ASSERT(Z_TYPE_P(zv) != IS_REFERENCE); ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { - if (!i_zend_verify_type_assignable_zval(prop->type, zv, strict)) { + int result; + + /* Only sources that carry a type should be registered. */ + zend_type type = prop->type; + ZEND_ASSERT(ZEND_TYPE_IS_SET(type)); + + result = i_zend_verify_type_assignable_zval(type, 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(type) ? IS_OBJECT : ZEND_TYPE_CODE(type); + } else if (needs_coercion && seen_type != ZEND_TYPE_CODE(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, zv))) { + zend_throw_ref_type_error_zval(prop, zv); + return 0; + } + return 1; } @@ -2850,6 +2870,40 @@ ZEND_API zend_bool zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv return i_zend_verify_ref_assignable_zval(ref, zv, strict); } +ZEND_API zend_bool zend_verify_prop_assignable_by_ref(zend_property_info *prop_info, zval *orig_val, zend_bool strict) { + zval *val = orig_val; + if (Z_ISREF_P(val) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(val))) { + zend_type prop_type = zend_get_prop_info_ref_type(prop_info); + int result; + + val = Z_REFVAL_P(val); + result = i_zend_verify_type_assignable_zval(prop_type, 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_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_type), val, val)) { + return 1; + } + } + } else { + ZVAL_DEREF(val); + if (i_zend_verify_property_type(prop_info, val, val, strict)) { + return 1; + } + } + + zend_verify_property_type_error(prop_info, val); + return 0; +} + ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop) { zend_property_info_list *list = ZEND_PROPERTY_INFO_SOURCE_TO_LIST(source_list->list); diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 9c1c3fa3f98e..ce28252eec33 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -85,11 +85,12 @@ static zend_always_inline zend_bool zend_verify_type_assignable(zend_type type, || (cur_type == IS_ITERABLE && new_type == IS_ARRAY); } -ZEND_API zend_property_info *zend_verify_ref_assignable_type(zend_reference *ref, zend_type type); +ZEND_API zend_property_info *zend_check_ref_array_assignable(zend_reference *ref); ZEND_API zend_bool zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict); +ZEND_API zend_bool zend_verify_prop_assignable_by_ref(zend_property_info *prop_info, zval *orig_val, zend_bool strict); ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zval *zv); -ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(const char *source, zend_property_info *prop, zend_type type); +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 @@ -97,6 +98,12 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(const char *source, zend_ #define ZEND_REF_HAS_TYPE_SOURCES(ref) \ (ZEND_REF_TYPE_SOURCES(ref).ptr != NULL) +#define ZEND_REF_FIRST_SOURCE(ref) \ + (ZEND_PROPERTY_INFO_SOURCE_IS_LIST((ref)->sources.list) \ + ? ZEND_PROPERTY_INFO_SOURCE_TO_LIST((ref)->sources.list)->ptr[0] \ + : (ref)->sources.ptr) + + ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); ZEND_API void zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); @@ -492,26 +499,21 @@ ZEND_COLD void zend_verify_property_type_error(zend_property_info *info, zval *p #define ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) do { \ zend_property_info_source_list *_source_list = &ZEND_REF_TYPE_SOURCES(ref); \ - size_t _num; \ - zend_property_info *_prop; \ + 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); \ - _num = _list->num; \ - _prop = _list->ptr[--_num]; \ + _prop = _list->ptr; \ + _end = _list->ptr + _list->num; \ } else { \ - _prop = _source_list->ptr; \ - _num = 0; \ + _prop = &_source_list->ptr; \ + _end = _prop + 1; \ } \ - while (1) { \ - prop = _prop; \ + for (; _prop < _end; _prop++) { \ + prop = *_prop; \ #define ZEND_REF_FOREACH_TYPE_SOURCES_END() \ - if (_num == 0) { \ - break; \ - } \ - _prop = _list->ptr[--_num]; \ } \ } \ } while (0) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 6c7c38e761d8..2eecdf762e93 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -730,22 +730,7 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) && (prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot)))) { - zval *val = retval; - - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - /* the overloaded property type must be compatible with the reference type so that we don't coercively cast and end up with a value type not matching the reference type */ - if ((error_prop = zend_verify_ref_assignable_type(Z_REF_P(val), zend_get_prop_info_ref_type(prop_info)))) { - zend_throw_ref_type_error_type("Property", error_prop, zend_get_prop_info_ref_type(prop_info)); - goto exit; - } - /* we do not add a reference type here - reference types must be backed up by references being assigned to an actual typed container */ - val = Z_REFVAL_P(val); - } - - if (UNEXPECTED(zend_verify_property_type(prop_info, val, val, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES)) == NULL)) { - zend_verify_property_type_error(prop_info, val); - } + zend_verify_prop_assignable_by_ref(prop_info, retval, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES) != 0); } goto exit; } else if (Z_STRVAL_P(member)[0] == '\0' && Z_STRLEN_P(member) != 0) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d9051b1b637d..a848df56867c 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2532,7 +2532,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array): } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); FREE_UNFETCHED_OP2(); @@ -2698,8 +2698,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C FREE_OP2(); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((OP2_TYPE == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (OP2_TYPE == IS_CONST) { @@ -2709,23 +2708,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - FREE_OP1_VAR_PTR(); - FREE_OP2(); - FREE_OP_DATA_VAR_PTR(); - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { FREE_OP1_VAR_PTR(); FREE_OP2(); FREE_OP_DATA_VAR_PTR(); @@ -2738,7 +2721,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -2759,7 +2742,6 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -2784,21 +2766,7 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - FREE_OP_DATA_VAR_PTR(); - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { FREE_OP_DATA_VAR_PTR(); HANDLE_EXCEPTION(); } @@ -2808,7 +2776,7 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 16bc34a8e177..76fec9533595 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5320,7 +5320,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -5345,21 +5344,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -5369,7 +5354,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -8744,7 +8729,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -8769,21 +8753,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -8793,7 +8763,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -9633,7 +9603,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -9658,21 +9627,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -9682,7 +9637,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -15130,7 +15085,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -15155,21 +15109,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -15179,7 +15119,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -17495,7 +17435,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -17520,21 +17459,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -17544,7 +17469,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -18128,7 +18053,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -18153,21 +18077,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -18177,7 +18087,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -25849,7 +25759,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -25950,7 +25860,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -26051,7 +25961,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -26151,7 +26061,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -26296,8 +26206,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { @@ -26307,23 +26216,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -26336,7 +26229,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -26409,8 +26302,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { @@ -26420,23 +26312,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26449,7 +26325,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -28731,7 +28607,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -28832,7 +28708,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -28933,7 +28809,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -29033,7 +28909,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -29122,8 +28998,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -29133,23 +29008,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -29162,7 +29021,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -29235,8 +29094,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -29246,23 +29104,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - zval_ptr_dtor_nogc(free_op2); - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); @@ -29275,7 +29117,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -30663,7 +30505,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -30764,7 +30606,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -30865,7 +30707,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -30965,7 +30807,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -33130,7 +32972,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -33231,7 +33073,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -33332,7 +33174,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -33432,7 +33274,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -33625,8 +33467,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { @@ -33636,23 +33477,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -33665,7 +33490,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -33738,8 +33563,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { @@ -33749,23 +33573,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33778,7 +33586,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -35832,8 +35640,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { @@ -35843,23 +35650,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -35872,7 +35663,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -35944,8 +35735,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { @@ -35955,23 +35745,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { @@ -35984,7 +35758,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -37911,8 +37685,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -37922,23 +37695,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -37951,7 +37708,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -38023,8 +37780,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -38034,23 +37790,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - zval_ptr_dtor_nogc(free_op2); - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { zval_ptr_dtor_nogc(free_op2); @@ -38063,7 +37803,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -40614,8 +40354,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { @@ -40625,23 +40364,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -40654,7 +40377,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -40726,8 +40449,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { @@ -40737,23 +40459,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { @@ -40766,7 +40472,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -45984,7 +45690,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -46085,7 +45791,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -46186,7 +45892,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -46286,7 +45992,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -46431,8 +46137,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { @@ -46442,23 +46147,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -46471,7 +46160,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -46543,8 +46232,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { @@ -46554,23 +46242,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { @@ -46583,7 +46255,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -46603,7 +46275,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -46628,21 +46299,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -46652,7 +46309,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -50349,7 +50006,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50450,7 +50107,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50551,7 +50208,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50651,7 +50308,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50740,8 +50397,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -50751,23 +50407,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -50780,7 +50420,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -50852,8 +50492,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -50863,23 +50502,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - zval_ptr_dtor_nogc(free_op2); - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { zval_ptr_dtor_nogc(free_op2); @@ -50892,7 +50515,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -52220,7 +51843,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -52245,21 +51867,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -52269,7 +51877,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -53462,7 +53070,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -53563,7 +53171,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -53664,7 +53272,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -53764,7 +53372,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -53801,7 +53409,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -53826,21 +53433,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -53850,7 +53443,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -56985,7 +56578,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -57086,7 +56679,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -57187,7 +56780,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -57287,7 +56880,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -57480,8 +57073,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { @@ -57491,23 +57083,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -57520,7 +57096,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -57592,8 +57168,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { @@ -57603,23 +57178,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { @@ -57632,7 +57191,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } From ae8a1989fa96cbc4f7f215ae3a80e49da7333f3f Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 11 Jul 2018 23:11:52 +0200 Subject: [PATCH 288/369] Fix build without execute_data $register --- Zend/zend_vm_execute.h | 18 +++++++++--------- Zend/zend_vm_gen.php | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 7bb85714e254..51ebfc4c5205 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5343,7 +5343,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + 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); @@ -8762,7 +8762,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + 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); @@ -9636,7 +9636,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + 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); @@ -15123,7 +15123,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + 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); @@ -17483,7 +17483,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + 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); @@ -18101,7 +18101,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + 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); @@ -46379,7 +46379,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + 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); @@ -51957,7 +51957,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + 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); @@ -53523,7 +53523,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + 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); diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index c91cc4b76dc5..5b9f1e60cb04 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -573,7 +573,7 @@ ); $op_data_get_zval_ptr_ptr = array( - "ANY" => "get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, \\1 EXECUTE_DATA_CC)", + "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", From eda393bb712ff280a4f68973dc0e1f80b3735af0 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 13 Jul 2018 23:41:26 +0200 Subject: [PATCH 289/369] Move push/pop function prologue off fast path in VM --- Zend/zend_vm_def.h | 99 ++++++------- Zend/zend_vm_execute.h | 312 +++++++++++++++++++++-------------------- 2 files changed, 212 insertions(+), 199 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index bb719b75fbdc..1c4fe0f668f4 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1398,7 +1398,6 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1423,27 +1422,27 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - increment_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); - FREE_OP1_VAR_PTR(); - HANDLE_EXCEPTION(); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + increment_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); increment_function(var_ptr); } @@ -1460,7 +1459,6 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1485,27 +1483,28 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - decrement_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); - FREE_OP1_VAR_PTR(); - HANDLE_EXCEPTION(); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + decrement_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); decrement_function(var_ptr); } @@ -1522,7 +1521,6 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1543,17 +1541,21 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - increment_function(var_ptr); + increment_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + increment_function(var_ptr); } FREE_OP1_VAR_PTR(); @@ -1565,7 +1567,6 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1586,17 +1587,21 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + decrement_function(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + decrement_function(var_ptr); } FREE_OP1_VAR_PTR(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 51ebfc4c5205..35bc295c4157 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -22459,7 +22459,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22484,27 +22483,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - increment_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + increment_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); increment_function(var_ptr); } @@ -22521,7 +22520,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22546,27 +22544,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - increment_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + increment_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); increment_function(var_ptr); } @@ -22583,7 +22581,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22608,27 +22605,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - decrement_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + decrement_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); decrement_function(var_ptr); } @@ -22645,7 +22643,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22670,27 +22667,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - decrement_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + decrement_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); decrement_function(var_ptr); } @@ -22707,7 +22705,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22728,17 +22725,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - increment_function(var_ptr); + increment_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + increment_function(var_ptr); } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22750,7 +22751,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22771,17 +22771,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + decrement_function(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + decrement_function(var_ptr); } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -41195,7 +41199,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ USE_OPLINE zval *var_ptr; - zend_reference *ref = NULL; var_ptr = EX_VAR(opline->op1.var); @@ -41220,27 +41223,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - increment_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); - HANDLE_EXCEPTION(); + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + increment_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); increment_function(var_ptr); } @@ -41256,7 +41259,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA USE_OPLINE zval *var_ptr; - zend_reference *ref = NULL; var_ptr = EX_VAR(opline->op1.var); @@ -41281,27 +41283,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - increment_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); - HANDLE_EXCEPTION(); + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + increment_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); increment_function(var_ptr); } @@ -41317,7 +41319,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ USE_OPLINE zval *var_ptr; - zend_reference *ref = NULL; var_ptr = EX_VAR(opline->op1.var); @@ -41342,27 +41343,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - decrement_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); - HANDLE_EXCEPTION(); + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + decrement_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); decrement_function(var_ptr); } @@ -41378,7 +41380,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA USE_OPLINE zval *var_ptr; - zend_reference *ref = NULL; var_ptr = EX_VAR(opline->op1.var); @@ -41403,27 +41404,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - decrement_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); - HANDLE_EXCEPTION(); + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + decrement_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); decrement_function(var_ptr); } @@ -41439,7 +41441,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr; - zend_reference *ref = NULL; var_ptr = EX_VAR(opline->op1.var); @@ -41460,17 +41461,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + increment_function(var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + increment_function(var_ptr); } ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -41481,7 +41486,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr; - zend_reference *ref = NULL; var_ptr = EX_VAR(opline->op1.var); @@ -41502,17 +41506,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - decrement_function(var_ptr); + decrement_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + decrement_function(var_ptr); } ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); From 1f737291c7e09a297ee083f1a591d22dabae0a97 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 16 Jul 2018 21:03:32 +0200 Subject: [PATCH 290/369] Resolve aliases during property type LSP checks --- .../typed_properties_084.phpt | 25 ++++++++++++++++ Zend/zend_inheritance.c | 30 ++++++++++++++++--- 2 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_084.phpt 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 000000000000..fb3c86115eee --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_084.phpt @@ -0,0 +1,25 @@ +--TEST-- +Typed properties and class aliases +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index a8865239fdde..c85572da04ab 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -676,6 +676,30 @@ zend_string* zend_resolve_property_type(zend_string *type, zend_class_entry *sco return type; } /* }}} */ +zend_bool class_types_compatible( + zend_type parent_type, zend_class_entry *parent_ce, + zend_type child_type, zend_class_entry *child_ce +) { + zend_string *parent_name = ZEND_TYPE_IS_CE(parent_type) + ? ZEND_TYPE_CE(parent_type)->name + : zend_resolve_property_type(ZEND_TYPE_NAME(parent_type), parent_ce); + zend_string *child_name = ZEND_TYPE_IS_CE(child_type) + ? ZEND_TYPE_CE(child_type)->name + : zend_resolve_property_type(ZEND_TYPE_NAME(child_type), child_ce); + if (zend_string_equals_ci(parent_name, child_name)) { + return 1; + } else { + /* Check for class aliases */ + zend_class_entry *parent_type_ce = ZEND_TYPE_IS_CE(parent_type) + ? ZEND_TYPE_CE(parent_type) + : zend_lookup_class(parent_name); + zend_class_entry *child_type_ce = ZEND_TYPE_IS_CE(child_type) + ? ZEND_TYPE_CE(child_type) + : zend_lookup_class(child_name); + return parent_type_ce && child_type_ce && parent_type_ce == child_type_ce; + } +} + static void do_inherit_property(zend_property_info *parent_info, zend_string *key, zend_class_entry *ce) /* {{{ */ { zval *child = zend_hash_find_ex(&ce->properties_info, key, 1); @@ -714,10 +738,8 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke if (ZEND_TYPE_IS_CLASS(parent_info->type)) { if (!ZEND_TYPE_IS_CLASS(child_info->type) || ZEND_TYPE_ALLOW_NULL(child_info->type) != ZEND_TYPE_ALLOW_NULL(parent_info->type) || - !zend_string_equals_ci( - ZEND_TYPE_IS_CE(parent_info->type) ? ZEND_TYPE_CE(parent_info->type)->name : zend_resolve_property_type(ZEND_TYPE_NAME(parent_info->type), parent_info->ce), - ZEND_TYPE_IS_CE(child_info->type) ? ZEND_TYPE_CE(child_info->type)->name : zend_resolve_property_type(ZEND_TYPE_NAME(child_info->type), child_info->ce) - )) { + !class_types_compatible(parent_info->type, parent_info->ce, child_info->type, child_info->ce) + ) { zend_error_noreturn(E_COMPILE_ERROR, "Type of %s::$%s must be %s%s (as in class %s)", ZSTR_VAL(ce->name), From 7f25e95a684b360d4e3fc39292249696eb9d415d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 16 Jul 2018 21:18:57 +0200 Subject: [PATCH 291/369] Check for conflicting property types in traits --- .../typed_properties_085.phpt | 17 ++++++ Zend/zend_inheritance.c | 55 +++++++++++-------- 2 files changed, 48 insertions(+), 24 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_085.phpt 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 000000000000..ccac3768cb1c --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_085.phpt @@ -0,0 +1,17 @@ +--TEST-- +Important properties with different types from traits +--FILE-- + +--EXPECTF-- +Fatal error: T1 and T2 define the same property ($prop) in the composition of C. However, the definition differs and is considered incompatible. Class was composed in %s on line %d diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index c85572da04ab..791b3ed88991 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -676,28 +676,36 @@ zend_string* zend_resolve_property_type(zend_string *type, zend_class_entry *sco return type; } /* }}} */ -zend_bool class_types_compatible( - zend_type parent_type, zend_class_entry *parent_ce, - zend_type child_type, zend_class_entry *child_ce -) { - zend_string *parent_name = ZEND_TYPE_IS_CE(parent_type) - ? ZEND_TYPE_CE(parent_type)->name - : zend_resolve_property_type(ZEND_TYPE_NAME(parent_type), parent_ce); - zend_string *child_name = ZEND_TYPE_IS_CE(child_type) - ? ZEND_TYPE_CE(child_type)->name - : zend_resolve_property_type(ZEND_TYPE_NAME(child_type), child_ce); +zend_bool property_types_compatible(zend_property_info *parent_info, zend_property_info *child_info) { + zend_string *parent_name, *child_name; + zend_class_entry *parent_type_ce, *child_type_ce; + if (parent_info->type == child_info->type) { + return 1; + } + + if (!ZEND_TYPE_IS_CLASS(parent_info->type) || !ZEND_TYPE_IS_CLASS(child_info->type) || + ZEND_TYPE_ALLOW_NULL(parent_info->type) != ZEND_TYPE_ALLOW_NULL(child_info->type)) { + return 0; + } + + parent_name = ZEND_TYPE_IS_CE(parent_info->type) + ? ZEND_TYPE_CE(parent_info->type)->name + : zend_resolve_property_type(ZEND_TYPE_NAME(parent_info->type), parent_info->ce); + child_name = ZEND_TYPE_IS_CE(child_info->type) + ? ZEND_TYPE_CE(child_info->type)->name + : zend_resolve_property_type(ZEND_TYPE_NAME(child_info->type), child_info->ce); if (zend_string_equals_ci(parent_name, child_name)) { return 1; - } else { - /* Check for class aliases */ - zend_class_entry *parent_type_ce = ZEND_TYPE_IS_CE(parent_type) - ? ZEND_TYPE_CE(parent_type) - : zend_lookup_class(parent_name); - zend_class_entry *child_type_ce = ZEND_TYPE_IS_CE(child_type) - ? ZEND_TYPE_CE(child_type) - : zend_lookup_class(child_name); - return parent_type_ce && child_type_ce && parent_type_ce == child_type_ce; } + + /* Check for class aliases */ + parent_type_ce = ZEND_TYPE_IS_CE(parent_info->type) + ? ZEND_TYPE_CE(parent_info->type) + : zend_lookup_class(parent_name); + child_type_ce = ZEND_TYPE_IS_CE(child_info->type) + ? ZEND_TYPE_CE(child_info->type) + : zend_lookup_class(child_name); + return parent_type_ce && child_type_ce && parent_type_ce == child_type_ce; } static void do_inherit_property(zend_property_info *parent_info, zend_string *key, zend_class_entry *ce) /* {{{ */ @@ -736,10 +744,7 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke if (UNEXPECTED(ZEND_TYPE_IS_SET(parent_info->type) && !(parent_info->flags & ZEND_ACC_PRIVATE))) { if (ZEND_TYPE_IS_CLASS(parent_info->type)) { - if (!ZEND_TYPE_IS_CLASS(child_info->type) || - ZEND_TYPE_ALLOW_NULL(child_info->type) != ZEND_TYPE_ALLOW_NULL(parent_info->type) || - !class_types_compatible(parent_info->type, parent_info->ce, child_info->type, child_info->ce) - ) { + if (!property_types_compatible(parent_info, child_info)) { zend_error_noreturn(E_COMPILE_ERROR, "Type of %s::$%s must be %s%s (as in class %s)", ZSTR_VAL(ce->name), @@ -1659,7 +1664,9 @@ static void zend_do_traits_property_binding(zend_class_entry *ce) /* {{{ */ not_compatible = 1; if ((coliding_prop->flags & (ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC)) - == (flags & (ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC))) { + == (flags & (ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC)) && + property_types_compatible(property_info, coliding_prop) + ) { /* the flags are identical, thus, the properties may be compatible */ zval *op1, *op2; zval op1_tmp, op2_tmp; From 398027bdbf598b7a38914cfd7a3166a94fe93171 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 21 Jul 2018 11:59:06 +0000 Subject: [PATCH 292/369] Fix write_property handlers and add zend_std_get_property_with_info --- Zend/tests/type_declarations/typed_properties_061.phpt | 2 ++ Zend/tests/type_declarations/typed_properties_075.phpt | 2 ++ Zend/zend_API.c | 5 ++--- Zend/zend_closures.c | 3 ++- Zend/zend_execute.c | 2 +- Zend/zend_object_handlers.c | 8 +++++++- Zend/zend_object_handlers.h | 3 ++- ext/com_dotnet/com_handlers.c | 3 ++- ext/com_dotnet/com_saproxy.c | 2 +- ext/pdo/pdo_stmt.c | 5 +++-- ext/reflection/php_reflection.c | 5 ++--- 11 files changed, 26 insertions(+), 14 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_061.phpt b/Zend/tests/type_declarations/typed_properties_061.phpt index a12d2c76eaa7..647543c6d6df 100644 --- a/Zend/tests/type_declarations/typed_properties_061.phpt +++ b/Zend/tests/type_declarations/typed_properties_061.phpt @@ -1,5 +1,7 @@ --TEST-- Typed property on overloaded by-ref property +--SKIPIF-- + --FILE-- --FILE-- properties_info, property_name); @@ -1549,6 +1549,12 @@ ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *p } /* }}} */ +ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, int type) /* {{{ */ +{ + zend_property_info *prop_info; + return zend_std_get_static_property_with_info(ce, property_name, type, &prop_info); +} + ZEND_API ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name) /* {{{ */ { zend_throw_error(NULL, "Attempt to unset static property %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(property_name)); diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index 23b51b364b35..58458bd3b983 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -175,7 +175,8 @@ extern const ZEND_API zend_object_handlers std_object_handlers; ((fbc)->common.prototype ? (fbc)->common.prototype->common.scope : (fbc)->common.scope) 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, int type, struct _zend_property_info **prop_info); +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); diff --git a/ext/com_dotnet/com_handlers.c b/ext/com_dotnet/com_handlers.c index 28814de09d9d..35d94117e587 100644 --- a/ext/com_dotnet/com_handlers.c +++ b/ext/com_dotnet/com_handlers.c @@ -60,7 +60,7 @@ static zval *com_property_read(zval *object, zval *member, int type, void **cahc return rv; } -static void com_property_write(zval *object, zval *member, zval *value, void **cache_slot) +static zval *com_property_write(zval *object, zval *member, zval *value, void **cache_slot) { php_com_dotnet_object *obj; VARIANT v; @@ -78,6 +78,7 @@ static void com_property_write(zval *object, zval *member, zval *value, void **c } else { php_com_throw_exception(E_INVALIDARG, "this variant has no properties"); } + return value; } static zval *com_read_dimension(zval *object, zval *offset, int type, zval *rv) diff --git a/ext/com_dotnet/com_saproxy.c b/ext/com_dotnet/com_saproxy.c index 81bbb63ca85e..4600048ec3a2 100644 --- a/ext/com_dotnet/com_saproxy.c +++ b/ext/com_dotnet/com_saproxy.c @@ -71,7 +71,7 @@ static inline void clone_indices(php_com_saproxy *dest, php_com_saproxy *src, in } } -static zval *saproxy_property_read(zval *object, zval *member, int type, void **cahce_slot, zval *rv) +static zval *saproxy_property_read(zval *object, zval *member, int type, void **cache_slot, zval *rv) { ZVAL_NULL(rv); diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index a6b2bedc0bd9..f13203343e8d 100644 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -2189,7 +2189,7 @@ const zend_function_entry pdo_dbstmt_functions[] = { }; /* {{{ overloaded handlers for PDOStatement class */ -static void dbstmt_prop_write(zval *object, zval *member, zval *value, void **cache_slot) +static zval *dbstmt_prop_write(zval *object, zval *member, zval *value, void **cache_slot) { pdo_stmt_t *stmt = Z_PDO_STMT_P(object); @@ -2197,8 +2197,9 @@ static void dbstmt_prop_write(zval *object, zval *member, zval *value, void **ca if (strcmp(Z_STRVAL_P(member), "queryString") == 0) { pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "property queryString is read only"); + return value; } else { - zend_std_write_property(object, member, value, cache_slot); + return zend_std_write_property(object, member, value, cache_slot); } } diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 9350d1a174c4..a4db99182e8d 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3890,7 +3890,6 @@ ZEND_METHOD(reflection_class, getStaticPropertyValue) { reflection_object *intern; zend_class_entry *ce; - zend_property_info *prop_info; zend_string *name; zval *prop, *def_value = NULL; @@ -3903,7 +3902,7 @@ ZEND_METHOD(reflection_class, getStaticPropertyValue) if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) { return; } - prop = zend_std_get_static_property(ce, name, BP_VAR_IS, &prop_info); + prop = zend_std_get_static_property(ce, name, BP_VAR_IS); if (!prop) { if (def_value) { ZVAL_COPY(return_value, def_value); @@ -3937,7 +3936,7 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) { return; } - variable_ptr = zend_std_get_static_property(ce, name, BP_VAR_W, &prop_info); + variable_ptr = zend_std_get_static_property_with_info(ce, name, BP_VAR_W, &prop_info); if (!variable_ptr) { zend_clear_exception(); zend_throw_exception_ex(reflection_exception_ptr, 0, From e7b86fb60e39eca09d6c92fb7c9884aefb1881e4 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 21 Jul 2018 12:03:23 +0000 Subject: [PATCH 293/369] Remove *tmp arg from zend_verify_property_type() --- .../typed_properties_023.phpt | 2 + Zend/zend_API.c | 23 +- Zend/zend_execute.c | 108 +- Zend/zend_execute.h | 2 +- Zend/zend_object_handlers.c | 16 +- Zend/zend_vm_def.h | 55 +- Zend/zend_vm_execute.h | 1878 +++++++++++------ ext/reflection/php_reflection.c | 2 +- ext/standard/var_unserializer.c | 69 +- ext/standard/var_unserializer.re | 5 +- 10 files changed, 1346 insertions(+), 814 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_023.phpt b/Zend/tests/type_declarations/typed_properties_023.phpt index e6ab663b2b36..320a7bc8b590 100644 --- a/Zend/tests/type_declarations/typed_properties_023.phpt +++ b/Zend/tests/type_declarations/typed_properties_023.phpt @@ -30,6 +30,7 @@ Foo::$i = ref(); var_dump(Foo::$i); Foo::$s = ref(); var_dump(Foo::$s); +var_dump(ref()); ?> --EXPECTF-- string(1) "x" @@ -41,3 +42,4 @@ string(1) "3" int(4) int(5) string(1) "5" +int(5) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 58e75620e4a3..6e5016b9fe55 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1174,21 +1174,20 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */ ZVAL_DEREF(val); if (Z_TYPE_P(val) == IS_CONSTANT_AST) { if (prop_info->type) { - zval tmp, tmp2, *v; + zval tmp; ZVAL_COPY(&tmp, val); if (UNEXPECTED(zval_update_constant_ex(&tmp, ce) != SUCCESS)) { return FAILURE; } - v = zend_verify_property_type(prop_info, &tmp, &tmp2, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); - if (UNEXPECTED(!v)) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { zend_verify_property_type_error(prop_info, &tmp); class_type->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; zval_ptr_dtor(&tmp); return FAILURE; } zval_ptr_dtor(val); - ZVAL_COPY_VALUE(val, v); + ZVAL_COPY_VALUE(val, &tmp); } else if (UNEXPECTED(zval_update_constant_ex(val, ce) != SUCCESS)) { return FAILURE; } @@ -1246,14 +1245,14 @@ ZEND_API void object_properties_init_ex(zend_object *object, HashTable *properti zval *slot = OBJ_PROP(object, property_info->offset); if (UNEXPECTED(property_info->type)) { - zval tmp, *val; + zval tmp; - val = zend_verify_property_type(property_info, prop, &tmp, 0); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(property_info, prop); + ZVAL_COPY_VALUE(&tmp, prop); + if (UNEXPECTED(!zend_verify_property_type(property_info, &tmp, 0))) { + zend_verify_property_type_error(property_info, &tmp); continue; } - ZVAL_COPY_VALUE(slot, val); + ZVAL_COPY_VALUE(slot, &tmp); } else { ZVAL_COPY_VALUE(slot, prop); } @@ -4115,13 +4114,13 @@ ZEND_API int zend_update_static_property_ex(zend_class_entry *scope, zend_string Z_TRY_ADDREF_P(value); if (prop_info->type) { - zval *val = zend_verify_property_type(prop_info, value, &tmp, /* strict */ 0); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, /* strict */ 0))) { zend_verify_property_type_error(prop_info, value); Z_TRY_DELREF_P(value); return FAILURE; } - value = val; + value = &tmp; } zend_assign_to_variable(property, value, IS_VAR, /* strict */ 0); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9b7a6bb2d20e..b8a9399d20fa 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -822,7 +822,7 @@ static int is_null_constant(zend_class_entry *scope, zval *default_value) return 0; } -static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *arg, zval *ret) +static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *arg) { switch (type_hint) { case _IS_BOOL: { @@ -832,7 +832,7 @@ static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *a return 0; } zval_ptr_dtor(arg); - ZVAL_BOOL(ret, dest); + ZVAL_BOOL(arg, dest); return 1; } case IS_LONG: { @@ -842,7 +842,7 @@ static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *a return 0; } zval_ptr_dtor(arg); - ZVAL_LONG(ret, dest); + ZVAL_LONG(arg, dest); return 1; } case IS_DOUBLE: { @@ -852,34 +852,21 @@ static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *a return 0; } zval_ptr_dtor(arg); - ZVAL_DOUBLE(ret, dest); + ZVAL_DOUBLE(arg, dest); return 1; } case IS_STRING: { zend_string *dest; - if (arg != ret) { - ZVAL_COPY(ret, arg); - /* on success "ret" is converted to IS_STRING */ - if (!zend_parse_arg_str_weak(ret, &dest)) { - zval_ptr_dtor(ret); - return 0; - } - zval_ptr_dtor(arg); - return 1; - } - /* on success "ret" is converted to IS_STRING */ - if (!zend_parse_arg_str_weak(ret, &dest)) { - return 0; - } - return 1; + /* on success "arg" is converted to IS_STRING */ + return zend_parse_arg_str_weak(arg, &dest); } default: return 0; } } -static zend_bool zend_verify_scalar_type_hint(zend_uchar type_hint, zval *arg, zval *ret, zend_bool strict) +static zend_bool zend_verify_scalar_type_hint(zend_uchar type_hint, zval *arg, zend_bool strict) { if (UNEXPECTED(strict)) { /* SSTH Exception: IS_LONG may be accepted as IS_DOUBLE (converted) */ @@ -890,7 +877,7 @@ static zend_bool zend_verify_scalar_type_hint(zend_uchar type_hint, zval *arg, z /* NULL may be accepted only by nullable hints (this is already checked) */ return 0; } - return zend_verify_weak_scalar_type_hint(type_hint, arg, ret); + 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) @@ -946,52 +933,49 @@ ZEND_API zend_bool zend_load_property_class_type(zend_property_info *info) { return 1; } -static zend_always_inline zval* i_zend_verify_property_type(zend_property_info *info, zval *property, zval *tmp, zend_bool strict) +static zend_always_inline zend_bool i_zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) { if (ZEND_TYPE_IS_CLASS(info->type)) { if (UNEXPECTED(Z_TYPE_P(property) != IS_OBJECT)) { if (EXPECTED(Z_TYPE_P(property) == IS_NULL) && EXPECTED(ZEND_TYPE_ALLOW_NULL(info->type))) { - return property; + return 1; } - return NULL; + return 0; } if (UNEXPECTED(!ZEND_TYPE_IS_CE(info->type)) && UNEXPECTED(!zend_load_property_class_type(info))) { - return NULL; + return 0; } if (EXPECTED(instanceof_function(Z_OBJCE_P(property), ZEND_TYPE_CE(info->type)))) { - return property; + return 1; } - return NULL; + return 0; } if (EXPECTED(ZEND_TYPE_CODE(info->type) == Z_TYPE_P(property))) { - return property; + return 1; } else if (EXPECTED(Z_TYPE_P(property) == IS_NULL)) { - return EXPECTED(ZEND_TYPE_ALLOW_NULL(info->type)) ? property : NULL; + return ZEND_TYPE_ALLOW_NULL(info->type); } else if (EXPECTED(ZEND_TYPE_CODE(info->type) == IS_CALLABLE)) { if (Z_TYPE_P(property) == IS_OBJECT) { - return instanceof_function(zend_ce_closure, Z_OBJCE_P(property)) ? - property : NULL; + return instanceof_function(zend_ce_closure, Z_OBJCE_P(property)); } else { - return zend_is_callable(property, IS_CALLABLE_CHECK_SILENT, NULL) ? - property : NULL; + return zend_is_callable(property, IS_CALLABLE_CHECK_SILENT, NULL); } } else if (ZEND_TYPE_CODE(info->type) == _IS_BOOL && EXPECTED(Z_TYPE_P(property) == IS_FALSE || Z_TYPE_P(property) == IS_TRUE)) { - return property; + return 1; } else if (ZEND_TYPE_CODE(info->type) == IS_ITERABLE) { - return zend_is_iterable(property) ? property : NULL; + return zend_is_iterable(property); } else { - return zend_verify_scalar_type_hint(ZEND_TYPE_CODE(info->type), property, tmp, strict) ? - tmp : NULL; + return zend_verify_scalar_type_hint(ZEND_TYPE_CODE(info->type), property, strict); } } -zval* zend_verify_property_type(zend_property_info *info, zval *property, zval *tmp, zend_bool strict) +zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) { - return i_zend_verify_property_type(info, property, tmp, strict); + return i_zend_verify_property_type(info, property, strict); } static zend_always_inline zend_bool zend_check_type( @@ -1045,7 +1029,7 @@ static zend_always_inline zend_bool zend_check_type( } 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, arg, + return zend_verify_scalar_type_hint(ZEND_TYPE_CODE(type), arg, is_return_type ? ZEND_RET_USES_STRICT_TYPES() : ZEND_ARG_USES_STRICT_TYPES()); } @@ -1569,17 +1553,12 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i } else { fast_long_decrement_function(prop); } - if (UNEXPECTED(Z_TYPE_P(prop) != IS_LONG) && UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, prop, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop); - if (inc) { - ZVAL_LONG(prop, ZEND_LONG_MAX); - } else { - ZVAL_LONG(prop, ZEND_LONG_MIN); - } + if (UNEXPECTED(Z_TYPE_P(prop) != IS_LONG) && UNEXPECTED(prop_info) && UNEXPECTED(!zend_verify_property_type(prop_info, prop, EX_USES_STRICT_TYPES()))) { + zend_verify_property_type_error(prop_info, prop); + if (inc) { + ZVAL_LONG(prop, ZEND_LONG_MAX); + } else { + ZVAL_LONG(prop, ZEND_LONG_MIN); } } } else { @@ -1601,7 +1580,7 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i } else { decrement_function(&z_copy); } - if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -1634,17 +1613,12 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ fast_long_decrement_function(prop); } if (UNEXPECTED(Z_TYPE_P(prop) != IS_LONG)) { - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, prop, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop); - if (inc) { - ZVAL_LONG(prop, ZEND_LONG_MAX); - } else { - ZVAL_LONG(prop, ZEND_LONG_MIN); - } + if (UNEXPECTED(prop_info) && UNEXPECTED(!zend_verify_property_type(prop_info, prop, EX_USES_STRICT_TYPES()))) { + zend_verify_property_type_error(prop_info, prop); + if (inc) { + ZVAL_LONG(prop, ZEND_LONG_MAX); + } else { + ZVAL_LONG(prop, ZEND_LONG_MIN); } } } @@ -1669,7 +1643,7 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ } else { decrement_function(&z_copy); } - if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -2849,7 +2823,7 @@ static zend_always_inline zend_bool i_zend_verify_ref_assignable_zval(zend_refer } } ZEND_REF_FOREACH_TYPE_SOURCES_END(); - if (UNEXPECTED(needs_coercion && !zend_verify_weak_scalar_type_hint(seen_type, zv, zv))) { + if (UNEXPECTED(needs_coercion && !zend_verify_weak_scalar_type_hint(seen_type, zv))) { zend_throw_ref_type_error_zval(prop, zv); return 0; } @@ -2881,13 +2855,13 @@ ZEND_API zend_bool zend_verify_prop_assignable_by_ref(zend_property_info *prop_i zend_throw_ref_type_error_type(ref_prop, prop_info, val); return 0; } - if (zend_verify_weak_scalar_type_hint(ZEND_TYPE_CODE(prop_type), val, val)) { + if (zend_verify_weak_scalar_type_hint(ZEND_TYPE_CODE(prop_type), val)) { return 1; } } } else { ZVAL_DEREF(val); - if (i_zend_verify_property_type(prop_info, val, val, strict)) { + if (i_zend_verify_property_type(prop_info, val, strict)) { return 1; } } diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index cf1e93caa08e..f8ac4260220d 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -488,7 +488,7 @@ static zend_always_inline zend_property_info* zend_object_fetch_property_type_in return NULL; } -zval* zend_verify_property_type(zend_property_info *info, zval *property, zval *tmp, zend_bool strict); +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) \ diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 75242b9d074d..95ac78d4067c 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -786,19 +786,19 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, variable_ptr = OBJ_PROP(zobj, property_offset); if (Z_TYPE_P(variable_ptr) != IS_UNDEF) { zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot); - zval tmp, *val; + zval tmp; Z_TRY_ADDREF_P(value); if (UNEXPECTED(prop_info)) { - val = zend_verify_property_type(prop_info, value, &tmp, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); - if (UNEXPECTED(!val)) { + 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))))) { zend_verify_property_type_error(prop_info, value); Z_TRY_DELREF_P(value); value = &EG(error_zval); goto exit; } - value = val; + value = &tmp; } found: @@ -857,16 +857,16 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, } if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) { zend_property_info *prop_info; - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot))) { - val = zend_verify_property_type(prop_info, value, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); goto exit; } - value = val; + value = &tmp; } ZVAL_COPY_VALUE(OBJ_PROP(zobj, property_offset), value); } else { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 1c4fe0f668f4..8b09909443d3 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -854,7 +854,7 @@ ZEND_VM_C_LABEL(assign_op_object): zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -920,7 +920,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -2315,11 +2315,11 @@ ZEND_VM_C_LABEL(assign_object): property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); FREE_OP_DATA(); FREE_OP2(); @@ -2327,10 +2327,10 @@ ZEND_VM_C_LABEL(assign_object): HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (OP_DATA_TYPE == IS_CONST && val == value) { + if (OP_DATA_TYPE == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } ZEND_VM_C_LABEL(fast_assign_obj): @@ -2419,9 +2419,12 @@ ZEND_VM_HANDLER(200, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if !defined(ZEND_VM_SPEC) || !(OP_DATA_TYPE & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -2434,30 +2437,42 @@ ZEND_VM_HANDLER(200, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); if (UNEXPECTED(prop_info->type)) { +#if defined(ZEND_VM_SPEC) && (OP_DATA_TYPE & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if !defined(ZEND_VM_SPEC) || (OP_DATA_TYPE & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((OP_DATA_TYPE & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((OP_DATA_TYPE & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - FREE_OP_DATA(); + zval_ptr_dtor(value); + if ((OP_DATA_TYPE & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((OP_DATA_TYPE & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if !defined(ZEND_VM_SPEC) || !(OP_DATA_TYPE & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((OP_DATA_TYPE & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 35bc295c4157..afab073cda9e 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4600,7 +4600,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -5124,9 +5124,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -5139,30 +5142,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -5176,9 +5191,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -5191,30 +5209,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -5228,9 +5258,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -5243,30 +5276,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -5280,9 +5325,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -5295,30 +5343,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -7178,7 +7238,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -8543,9 +8603,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -8558,30 +8621,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -8595,9 +8670,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -8610,30 +8688,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -8647,9 +8737,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -8662,30 +8755,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -8699,9 +8804,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -8714,30 +8822,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -9049,7 +9169,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -9417,9 +9537,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -9432,30 +9555,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -9469,9 +9604,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -9484,30 +9622,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -9521,9 +9671,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -9536,30 +9689,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -9573,9 +9738,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -9588,30 +9756,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -14904,9 +15084,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -14919,30 +15102,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -14956,9 +15151,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -14971,30 +15169,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -15008,9 +15218,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -15023,30 +15236,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -15060,9 +15285,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -15075,30 +15303,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -17264,9 +17504,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -17279,30 +17522,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -17316,9 +17571,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -17331,30 +17589,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -17368,9 +17638,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -17383,30 +17656,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -17420,9 +17705,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -17435,30 +17723,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } - - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -17882,9 +18182,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -17897,30 +18200,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -17934,9 +18249,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -17949,30 +18267,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -17986,9 +18316,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -18001,30 +18334,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -18038,9 +18383,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -18053,30 +18401,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } - - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -20253,7 +20613,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -20819,7 +21179,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -21518,7 +21878,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -24268,7 +24628,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -24334,7 +24694,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -25240,11 +25600,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -25252,10 +25612,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -25381,11 +25741,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -25393,10 +25753,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -25522,11 +25882,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -25534,10 +25894,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -25663,11 +26023,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -25675,10 +26035,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -27111,7 +27471,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -27177,7 +27537,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -28088,11 +28448,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -28100,10 +28460,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -28229,11 +28589,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -28241,10 +28601,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -28370,11 +28730,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -28382,10 +28742,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -28511,11 +28871,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -28523,10 +28883,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -30137,7 +30497,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -31634,7 +31994,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -32453,11 +32813,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -32465,10 +32825,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -32594,11 +32954,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -32606,10 +32966,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -32735,11 +33095,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -32747,10 +33107,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -32876,11 +33236,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -32888,10 +33248,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -34554,7 +34914,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -35132,11 +35492,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -35144,10 +35504,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -35273,11 +35633,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -35285,10 +35645,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -35414,11 +35774,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -35426,10 +35786,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -35555,11 +35915,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -35567,10 +35927,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -36600,7 +36960,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -37182,11 +37542,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -37194,10 +37554,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -37323,11 +37683,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -37335,10 +37695,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -37464,11 +37824,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -37476,10 +37836,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -37605,11 +37965,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -37617,10 +37977,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -39278,7 +39638,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -39856,11 +40216,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -39868,10 +40228,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -39997,11 +40357,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -40009,10 +40369,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -40138,11 +40498,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -40150,10 +40510,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -40279,11 +40639,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -40291,10 +40651,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -43658,7 +44018,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -43724,7 +44084,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -44993,11 +45353,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -45005,10 +45365,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -45134,11 +45494,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -45146,10 +45506,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -45275,11 +45635,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -45287,10 +45647,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -45416,11 +45776,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -45428,10 +45788,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -45520,9 +45880,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -45535,30 +45898,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -45572,9 +45947,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -45587,30 +45965,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -45624,9 +46014,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -45639,30 +46032,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } - - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -45676,9 +46081,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -45691,30 +46099,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -48294,7 +48714,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -48360,7 +48780,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -49522,11 +49942,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -49534,10 +49954,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -49663,11 +50083,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -49675,10 +50095,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -49804,11 +50224,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -49816,10 +50236,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -49945,11 +50365,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -49957,10 +50377,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -51641,9 +52061,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -51656,30 +52079,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } - - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -51693,9 +52128,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -51708,30 +52146,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -51745,9 +52195,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -51760,30 +52213,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -51797,9 +52262,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -51812,30 +52280,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -52301,7 +52781,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -52910,9 +53390,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -52925,30 +53408,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } - - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -52962,9 +53457,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -52977,30 +53475,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } - - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -53014,9 +53524,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -53029,30 +53542,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -53066,9 +53591,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -53081,30 +53609,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -55031,7 +55571,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -56099,11 +56639,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -56111,10 +56651,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -56240,11 +56780,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -56252,10 +56792,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -56381,11 +56921,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -56393,10 +56933,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -56522,11 +57062,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -56534,10 +57074,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index a4db99182e8d..595fd1d9a2c2 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3953,7 +3953,7 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) } } - if (prop_info->type && !zend_verify_property_type(prop_info, value, value, 0)) { + if (prop_info->type && !zend_verify_property_type(prop_info, value, 0)) { zend_verify_property_type_error(prop_info, value); return; } diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c index cedb0782db33..97413ff79808 100644 --- a/ext/standard/var_unserializer.c +++ b/ext/standard/var_unserializer.c @@ -546,11 +546,12 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab } if (UNEXPECTED(info)) { - data = zend_verify_property_type(info, data, &tmp, 1); - if (UNEXPECTED(!data)) { + ZVAL_COPY_VALUE(&tmp, data); + if (UNEXPECTED(!zend_verify_property_type(info, &tmp, 1))) { zval_dtor(&key); return 0; } + data = &tmp; ZVAL_COPY(old_data, data); } @@ -721,7 +722,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) start = cursor; -#line 725 "ext/standard/var_unserializer.c" +#line 726 "ext/standard/var_unserializer.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -779,9 +780,9 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) yy2: ++YYCURSOR; yy3: -#line 1124 "ext/standard/var_unserializer.re" +#line 1125 "ext/standard/var_unserializer.re" { return 0; } -#line 785 "ext/standard/var_unserializer.c" +#line 786 "ext/standard/var_unserializer.c" yy4: yych = *(YYMARKER = ++YYCURSOR); if (yych == ':') goto yy17; @@ -828,13 +829,13 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy3; yy15: ++YYCURSOR; -#line 1118 "ext/standard/var_unserializer.re" +#line 1119 "ext/standard/var_unserializer.re" { /* this is the case where we have less data than planned */ php_error_docref(NULL, E_NOTICE, "Unexpected end of serialized data"); return 0; /* not sure if it should be 0 or 1 here? */ } -#line 838 "ext/standard/var_unserializer.c" +#line 839 "ext/standard/var_unserializer.c" yy17: yych = *++YYCURSOR; if (yybm[0+yych] & 128) { @@ -845,13 +846,13 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy3; yy19: ++YYCURSOR; -#line 779 "ext/standard/var_unserializer.re" +#line 780 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_NULL(rval); return 1; } -#line 855 "ext/standard/var_unserializer.c" +#line 856 "ext/standard/var_unserializer.c" yy21: yych = *++YYCURSOR; if (yych <= '/') goto yy18; @@ -1055,7 +1056,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy18; yy57: ++YYCURSOR; -#line 729 "ext/standard/var_unserializer.re" +#line 730 "ext/standard/var_unserializer.re" { zend_long id; @@ -1080,7 +1081,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) return 1; } -#line 1084 "ext/standard/var_unserializer.c" +#line 1085 "ext/standard/var_unserializer.c" yy59: yych = *++YYCURSOR; if (yych == '"') goto yy80; @@ -1091,22 +1092,22 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy18; yy61: ++YYCURSOR; -#line 785 "ext/standard/var_unserializer.re" +#line 786 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_FALSE(rval); return 1; } -#line 1101 "ext/standard/var_unserializer.c" +#line 1102 "ext/standard/var_unserializer.c" yy63: ++YYCURSOR; -#line 791 "ext/standard/var_unserializer.re" +#line 792 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_TRUE(rval); return 1; } -#line 1110 "ext/standard/var_unserializer.c" +#line 1111 "ext/standard/var_unserializer.c" yy65: ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); @@ -1126,7 +1127,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } yy67: ++YYCURSOR; -#line 839 "ext/standard/var_unserializer.re" +#line 840 "ext/standard/var_unserializer.re" { #if SIZEOF_ZEND_LONG == 4 use_double: @@ -1135,7 +1136,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) ZVAL_DOUBLE(rval, zend_strtod((const char *)start + 2, NULL)); return 1; } -#line 1139 "ext/standard/var_unserializer.c" +#line 1140 "ext/standard/var_unserializer.c" yy69: yych = *++YYCURSOR; if (yych <= ',') { @@ -1157,7 +1158,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy18; yy72: ++YYCURSOR; -#line 797 "ext/standard/var_unserializer.re" +#line 798 "ext/standard/var_unserializer.re" { #if SIZEOF_ZEND_LONG == 4 int digits = YYCURSOR - start - 3; @@ -1183,14 +1184,14 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) ZVAL_LONG(rval, parse_iv(start + 2)); return 1; } -#line 1187 "ext/standard/var_unserializer.c" +#line 1188 "ext/standard/var_unserializer.c" yy74: yych = *++YYCURSOR; if (yych == '"') goto yy88; goto yy18; yy75: ++YYCURSOR; -#line 754 "ext/standard/var_unserializer.re" +#line 755 "ext/standard/var_unserializer.re" { zend_long id; @@ -1215,14 +1216,14 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) return 1; } -#line 1219 "ext/standard/var_unserializer.c" +#line 1220 "ext/standard/var_unserializer.c" yy77: yych = *++YYCURSOR; if (yych == '"') goto yy90; goto yy18; yy78: ++YYCURSOR; -#line 966 "ext/standard/var_unserializer.re" +#line 967 "ext/standard/var_unserializer.re" { size_t len, len2, len3, maxlen; zend_long elements; @@ -1374,10 +1375,10 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) return object_common2(UNSERIALIZE_PASSTHRU, elements); } -#line 1378 "ext/standard/var_unserializer.c" +#line 1379 "ext/standard/var_unserializer.c" yy80: ++YYCURSOR; -#line 888 "ext/standard/var_unserializer.re" +#line 889 "ext/standard/var_unserializer.re" { size_t len, maxlen; zend_string *str; @@ -1411,10 +1412,10 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) ZVAL_STR(rval, str); return 1; } -#line 1415 "ext/standard/var_unserializer.c" +#line 1416 "ext/standard/var_unserializer.c" yy82: ++YYCURSOR; -#line 922 "ext/standard/var_unserializer.re" +#line 923 "ext/standard/var_unserializer.re" { zend_long elements = parse_iv(start + 2); /* use iv() not uiv() in order to check data range */ @@ -1447,7 +1448,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) return finish_nested_data(UNSERIALIZE_PASSTHRU); } -#line 1451 "ext/standard/var_unserializer.c" +#line 1452 "ext/standard/var_unserializer.c" yy84: yych = *++YYCURSOR; if (yych <= '/') goto yy18; @@ -1466,7 +1467,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy18; yy88: ++YYCURSOR; -#line 955 "ext/standard/var_unserializer.re" +#line 956 "ext/standard/var_unserializer.re" { zend_long elements; if (!var_hash) return 0; @@ -1477,10 +1478,10 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } return object_common2(UNSERIALIZE_PASSTHRU, elements); } -#line 1481 "ext/standard/var_unserializer.c" +#line 1482 "ext/standard/var_unserializer.c" yy90: ++YYCURSOR; -#line 848 "ext/standard/var_unserializer.re" +#line 849 "ext/standard/var_unserializer.re" { size_t len, maxlen; char *str; @@ -1520,10 +1521,10 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } return 1; } -#line 1524 "ext/standard/var_unserializer.c" +#line 1525 "ext/standard/var_unserializer.c" yy92: ++YYCURSOR; -#line 823 "ext/standard/var_unserializer.re" +#line 824 "ext/standard/var_unserializer.re" { *p = YYCURSOR; @@ -1539,9 +1540,9 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) return 1; } -#line 1543 "ext/standard/var_unserializer.c" +#line 1544 "ext/standard/var_unserializer.c" } -#line 1126 "ext/standard/var_unserializer.re" +#line 1127 "ext/standard/var_unserializer.re" return 0; diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 9bd82367defe..c050c2d36c3d 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -550,11 +550,12 @@ string_key: } if (UNEXPECTED(info)) { - data = zend_verify_property_type(info, data, &tmp, 1); - if (UNEXPECTED(!data)) { + ZVAL_COPY_VALUE(&tmp, data); + if (UNEXPECTED(!zend_verify_property_type(info, &tmp, 1))) { zval_dtor(&key); return 0; } + data = &tmp; ZVAL_COPY(old_data, data); } From 92302a80abf0e3f12048f387e32b77a90af95493 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 21 Jul 2018 13:42:55 +0000 Subject: [PATCH 294/369] Remove useless separations/copies --- Zend/zend_execute.h | 2 +- Zend/zend_vm_def.h | 5 ----- Zend/zend_vm_execute.h | 45 ------------------------------------------ 3 files changed, 1 insertion(+), 51 deletions(-) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index f8ac4260220d..49bbf416e45c 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -67,7 +67,7 @@ static zend_always_inline zend_type zend_get_prop_info_ref_type(zend_property_in if (!EG(exception)) { zend_throw_error(NULL, "Class %s must be loaded when used by reference for property type", ZSTR_VAL(ZEND_TYPE_NAME(prop_info->type))); } - return 0x3FC; + return ZEND_TYPE_CODE(_IS_ERROR); } return prop_info->type; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 8b09909443d3..ab8b2cf290d5 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -842,7 +842,6 @@ ZEND_VM_C_LABEL(assign_op_object): is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if (OP2_TYPE == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -904,7 +903,6 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); @@ -913,7 +911,6 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -1082,7 +1079,6 @@ ZEND_VM_HELPER(zend_binary_assign_op_simple_helper, VAR|CV, CONST|TMPVAR|CV, bin zval old; ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { @@ -1092,7 +1088,6 @@ ZEND_VM_HELPER(zend_binary_assign_op_simple_helper, VAR|CV, CONST|TMPVAR|CV, bin zval_ptr_dtor(&old); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); binary_op(var_ptr, var_ptr, value); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index afab073cda9e..cdbb727df359 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4584,7 +4584,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -4593,7 +4592,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -7222,7 +7220,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -7231,7 +7228,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -9153,7 +9149,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -9162,7 +9157,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -20597,7 +20591,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -20606,7 +20599,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -21163,7 +21155,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -21172,7 +21163,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -21862,7 +21852,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -21871,7 +21860,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -24616,7 +24604,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -24678,7 +24665,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -24687,7 +24673,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -24855,7 +24840,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval old; ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { @@ -24865,7 +24849,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval_ptr_dtor(&old); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); binary_op(var_ptr, var_ptr, value); } @@ -27459,7 +27442,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -27521,7 +27503,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -27530,7 +27511,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -27699,7 +27679,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval old; ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { @@ -27709,7 +27688,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval_ptr_dtor(&old); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); binary_op(var_ptr, var_ptr, value); } @@ -30481,7 +30459,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -30490,7 +30467,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -31982,7 +31958,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -32162,7 +32137,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval old; ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { @@ -32172,7 +32146,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval_ptr_dtor(&old); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); binary_op(var_ptr, var_ptr, value); } @@ -34902,7 +34875,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -36948,7 +36920,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -39626,7 +39597,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -44006,7 +43976,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -44068,7 +44037,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -44077,7 +44045,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -44245,7 +44212,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval old; ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { @@ -44255,7 +44221,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval_ptr_dtor(&old); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); binary_op(var_ptr, var_ptr, value); } @@ -48702,7 +48667,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -48764,7 +48728,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -48773,7 +48736,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -48942,7 +48904,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval old; ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { @@ -48952,7 +48913,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval_ptr_dtor(&old); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); binary_op(var_ptr, var_ptr, value); } @@ -52765,7 +52725,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -52774,7 +52733,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -55559,7 +55517,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -55739,7 +55696,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval old; ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { @@ -55749,7 +55705,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval_ptr_dtor(&old); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); binary_op(var_ptr, var_ptr, value); } From ffbf025067dae598ea1c2e9fd0a42f4f4349011f Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Tue, 31 Jul 2018 19:21:09 +0200 Subject: [PATCH 295/369] handle by ref mysqli/PDO statement result binding --- ext/mysqli/mysqli_api.c | 28 +++----- ext/mysqlnd/mysqlnd_ps.c | 130 +++++----------------------------- ext/mysqlnd/mysqlnd_structs.h | 1 - ext/pdo/pdo_stmt.c | 3 +- 4 files changed, 32 insertions(+), 130 deletions(-) diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 2bcbe2846ebe..f8d71b8bbabd 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -969,17 +969,11 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) zval *result; /* it must be a reference, isn't it? */ if (Z_ISREF(stmt->result.vars[i])) { - result = Z_REFVAL(stmt->result.vars[i]); + result = stmt->result.vars[i]; } else { - result = &stmt->result.vars[i]; + continue; // but be safe ... } - /* - QQ: Isn't it quite better to call zval_dtor(). What if the user has - assigned a resource, or an array to the bound variable? We are going - to leak probably. zval_dtor() will handle also Unicode/Non-unicode mode. - */ /* Even if the string is of length zero there is one byte alloced so efree() in all cases */ - zval_ptr_dtor(result); if (!stmt->result.is_null[i]) { switch (stmt->result.buf[i].type) { case IS_LONG: @@ -1000,16 +994,16 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) } while (--j > 0); tmp[10]= '\0'; /* unsigned int > INT_MAX is 10 digits - ALWAYS */ - ZVAL_STRINGL(result, tmp, 10); + ZEND_TRY_ASSIGN_STRINGL(result, tmp, 10); efree(tmp); break; } #endif } if (stmt->stmt->fields[i].flags & UNSIGNED_FLAG) { - ZVAL_LONG(result, *(unsigned int *)stmt->result.buf[i].val); + ZEND_TRY_ASSIGN_LONG(result, *(unsigned int *)stmt->result.buf[i].val); } else { - ZVAL_LONG(result, *(int *)stmt->result.buf[i].val); + ZEND_TRY_ASSIGN_LONG(result, *(int *)stmt->result.buf[i].val); } break; case IS_DOUBLE: @@ -1026,7 +1020,7 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) dval = *((double *)stmt->result.buf[i].val); } - ZVAL_DOUBLE(result, dval); + ZEND_TRY_ASSIGN_DOUBLE(result, dval); break; } case IS_STRING: @@ -1067,20 +1061,20 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) * use MYSQLI_LL_SPEC. */ snprintf(tmp, sizeof(tmp), (stmt->stmt->fields[i].flags & UNSIGNED_FLAG)? MYSQLI_LLU_SPEC : MYSQLI_LL_SPEC, llval); - ZVAL_STRING(result, tmp); + ZEND_TRY_ASSIGN_STRING(result, tmp); } else { - ZVAL_LONG(result, llval); + ZEND_TRY_ASSIGN_LONG(result, llval); } } else { #if defined(MYSQL_DATA_TRUNCATED) && MYSQL_VERSION_ID > 50002 if (ret == MYSQL_DATA_TRUNCATED && *(stmt->stmt->bind[i].error) != 0) { /* result was truncated */ - ZVAL_STRINGL(result, stmt->result.buf[i].val, stmt->stmt->bind[i].buffer_length); + ZEND_TRY_ASSIGN_STRINGL(result, stmt->result.buf[i].val, stmt->stmt->bind[i].buffer_length); } else { #else { #endif - ZVAL_STRINGL(result, stmt->result.buf[i].val, stmt->result.buf[i].output_len); + ZEND_TRY_ASSIGN_STRINGL(result, stmt->result.buf[i].val, stmt->result.buf[i].output_len); } } break; @@ -1088,7 +1082,7 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) break; } } else { - ZVAL_NULL(result); + ZEND_TRY_ASSIGN_NULL(result); } } } else { diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c index f3fab43f0c07..ed872ca90040 100644 --- a/ext/mysqlnd/mysqlnd_ps.c +++ b/ext/mysqlnd/mysqlnd_ps.c @@ -641,39 +641,6 @@ MYSQLND_METHOD(mysqlnd_stmt, send_execute)(MYSQLND_STMT * const s, const enum_my UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status); if (stmt->result && stmt->state >= MYSQLND_STMT_PREPARED && stmt->field_count) { - /* - We don need to copy the data from the buffers which we will clean. - Because it has already been copied. See - #ifndef WE_DONT_COPY_IN_BUFFERED_AND_UNBUFFERED_BECAUSEOF_IS_REF - */ -#ifdef WE_DONT_COPY_IN_BUFFERED_AND_UNBUFFERED_BECAUSEOF_IS_REF - if (stmt->result_bind && - stmt->result_zvals_separated_once == TRUE && - stmt->state >= MYSQLND_STMT_USER_FETCHING) - { - /* - We need to copy the data from the buffers which we will clean. - The bound variables point to them only if the user has started - to fetch data (MYSQLND_STMT_USER_FETCHING). - We need to check 'result_zvals_separated_once' or we will leak - in the following scenario - prepare("select 1 from dual"); - execute(); - fetch(); <-- no binding, but that's not a problem - bind_result(); - execute(); <-- here we will leak because we separate without need - */ - unsigned int i; - for (i = 0; i < stmt->field_count; i++) { - if (stmt->result_bind[i].bound == TRUE) { - zval *result = &stmt->result_bind[i].zv; - ZVAL_DEREF(result); - Z_TRY_ADDREF_P(result); - } - } - } -#endif - s->m->flush(s); /* @@ -794,32 +761,12 @@ mysqlnd_stmt_fetch_row_buffered(MYSQLND_RES * result, void * param, const unsign } for (i = 0; i < result->field_count; i++) { - zval *result = &stmt->result_bind[i].zv; - - ZVAL_DEREF(result); - /* Clean what we copied last time */ -#ifndef WE_DONT_COPY_IN_BUFFERED_AND_UNBUFFERED_BECAUSEOF_IS_REF - zval_ptr_dtor(result); -#endif /* copy the type */ - if (stmt->result_bind[i].bound == TRUE) { + zval *resultzv = &stmt->result_bind[i].zv; + if (stmt->result_bind[i].bound == TRUE && !Z_ISUNDEF_P(resultzv)) { DBG_INF_FMT("i=%u type=%u", i, Z_TYPE(current_row[i])); - if (Z_TYPE(current_row[i]) != IS_NULL) { - /* - Copy the value. - Pre-condition is that the zvals in the result_bind buffer - have been ZVAL_NULL()-ed or to another simple type - (int, double, bool but not string). Because of the reference - counting the user can't delete the strings the variables point to. - */ - - ZVAL_COPY_VALUE(result, ¤t_row[i]); -#ifndef WE_DONT_COPY_IN_BUFFERED_AND_UNBUFFERED_BECAUSEOF_IS_REF - Z_TRY_ADDREF_P(result); -#endif - } else { - ZVAL_NULL(result); - } + Z_TRY_ADDREF(current_row[i]); + zend_try_assign_ex(resultzv, ¤t_row[i], 0); } } } @@ -899,28 +846,20 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES * result, void * param, const unsi } for (i = 0; i < field_count; i++) { - if (stmt->result_bind[i].bound == TRUE) { + zval *resultzv = &stmt->result_bind[i].zv; + if (stmt->result_bind[i].bound == TRUE && !Z_ISUNDEF_P(resultzv)) { zval *data = &result->unbuf->last_row_data[i]; - zval *result = &stmt->result_bind[i].zv; - ZVAL_DEREF(result); /* stmt->result_bind[i].zv has been already destructed in result->unbuf->m.free_last_data() */ -#ifndef WE_DONT_COPY_IN_BUFFERED_AND_UNBUFFERED_BECAUSEOF_IS_REF - zval_ptr_dtor(result); -#endif - if (!Z_ISNULL_P(data)) { - if ((Z_TYPE_P(data) == IS_STRING) && (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))){ - meta->fields[i].max_length = Z_STRLEN_P(data); - } - ZVAL_COPY_VALUE(result, data); - /* copied data, thus also the ownership. Thus null data */ - ZVAL_NULL(data); - } else { - ZVAL_NULL(result); + if ((Z_TYPE_P(data) == IS_STRING) && (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))){ + meta->fields[i].max_length = Z_STRLEN_P(data); } + zend_try_assign_ex(resultzv, data, 0); + /* copied data, thus also the ownership. Thus null data */ + ZVAL_NULL(data); } } MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_PS_UNBUF); @@ -1084,33 +1023,25 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned /* If no result bind, do nothing. We consumed the data */ for (i = 0; i < field_count; i++) { - if (stmt->result_bind[i].bound == TRUE) { + zval *resultzv = &stmt->result_bind[i].zv; + if (stmt->result_bind[i].bound == TRUE && Z_ISUNDEF_P(resultzv)) { zval *data = &result->unbuf->last_row_data[i]; - zval *result = &stmt->result_bind[i].zv; - ZVAL_DEREF(result); /* stmt->result_bind[i].zv has been already destructed in result->unbuf->m.free_last_data() */ -#ifndef WE_DONT_COPY_IN_BUFFERED_AND_UNBUFFERED_BECAUSEOF_IS_REF - zval_ptr_dtor(result); -#endif DBG_INF_FMT("i=%u bound_var=%p type=%u refc=%u", i, &stmt->result_bind[i].zv, Z_TYPE_P(data), Z_REFCOUNTED(stmt->result_bind[i].zv)? Z_REFCOUNT(stmt->result_bind[i].zv) : 0); - if (!Z_ISNULL_P(data)) { - if ((Z_TYPE_P(data) == IS_STRING) && - (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))) { - meta->fields[i].max_length = Z_STRLEN_P(data); - } - ZVAL_COPY_VALUE(result, data); - /* copied data, thus also the ownership. Thus null data */ - ZVAL_NULL(data); - } else { - ZVAL_NULL(result); + if ((Z_TYPE_P(data) == IS_STRING) && + (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))) { + meta->fields[i].max_length = Z_STRLEN_P(data); } + zend_try_assign_ex(resultzv, data, 0); + /* copied data, thus also the ownership. Thus null data */ + ZVAL_NULL(data); } } } else { @@ -1188,28 +1119,6 @@ MYSQLND_METHOD(mysqlnd_stmt, fetch)(MYSQLND_STMT * const s, zend_bool * const fe SET_EMPTY_ERROR(stmt->error_info); SET_EMPTY_ERROR(conn->error_info); - DBG_INF_FMT("result_bind=%p separated_once=%u", &stmt->result_bind, stmt->result_zvals_separated_once); - /* - The user might have not bound any variables for result. - Do the binding once she does it. - */ - if (stmt->result_bind && !stmt->result_zvals_separated_once) { - unsigned int i; - /* - mysqlnd_stmt_store_result() has been called free the bind - variables to prevent leaking of their previous content. - */ - for (i = 0; i < stmt->result->field_count; i++) { - if (stmt->result_bind[i].bound == TRUE) { - zval *result = &stmt->result_bind[i].zv; - ZVAL_DEREF(result); - zval_ptr_dtor(result); - ZVAL_NULL(result); - } - } - stmt->result_zvals_separated_once = TRUE; - } - ret = stmt->result->m.fetch_row(stmt->result, (void*)s, 0, fetched_anything); DBG_RETURN(ret); } @@ -1605,7 +1514,6 @@ MYSQLND_METHOD(mysqlnd_stmt, bind_result)(MYSQLND_STMT * const s, } mysqlnd_stmt_separate_result_bind(s); - stmt->result_zvals_separated_once = FALSE; stmt->result_bind = result_bind; for (i = 0; i < stmt->field_count; i++) { /* Prevent from freeing */ diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index 858b6620089c..525b0eeda10e 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -1259,7 +1259,6 @@ struct st_mysqlnd_stmt_data unsigned char send_types_to_server; MYSQLND_PARAM_BIND *param_bind; MYSQLND_RESULT_BIND *result_bind; - zend_bool result_zvals_separated_once; MYSQLND_UPSERT_STATUS * upsert_status; MYSQLND_UPSERT_STATUS upsert_status_impl; diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index f13203343e8d..c0d7cfee2230 100644 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -2542,9 +2542,10 @@ static zval *row_dim_read(zval *object, zval *member, int type, zval *rv) return row_prop_read(object, member, type, NULL, rv); } -static void row_prop_write(zval *object, zval *member, zval *value, void **cache_slot) +static zval *row_prop_write(zval *object, zval *member, zval *value, void **cache_slot) { php_error_docref(NULL, E_WARNING, "This PDORow is not from a writable result set"); + return value; } static void row_dim_write(zval *object, zval *member, zval *value) From 5e2ebdcb48a027e6537507e1ec5175ab6c8f2c34 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 15 Aug 2018 10:52:17 +0200 Subject: [PATCH 296/369] Fix string length updates --- ext/mysqlnd/mysqlnd_ps.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c index ed872ca90040..56ee51ab950c 100644 --- a/ext/mysqlnd/mysqlnd_ps.c +++ b/ext/mysqlnd/mysqlnd_ps.c @@ -854,10 +854,11 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES * result, void * param, const unsi stmt->result_bind[i].zv has been already destructed in result->unbuf->m.free_last_data() */ - if ((Z_TYPE_P(data) == IS_STRING) && (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))){ - meta->fields[i].max_length = Z_STRLEN_P(data); + if (zend_try_assign_ex(resultzv, data, 0) == SUCCESS) { + if ((Z_TYPE_P(data) == IS_STRING) && (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))){ + meta->fields[i].max_length = Z_STRLEN_P(data); + } } - zend_try_assign_ex(resultzv, data, 0); /* copied data, thus also the ownership. Thus null data */ ZVAL_NULL(data); } @@ -1024,7 +1025,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned /* If no result bind, do nothing. We consumed the data */ for (i = 0; i < field_count; i++) { zval *resultzv = &stmt->result_bind[i].zv; - if (stmt->result_bind[i].bound == TRUE && Z_ISUNDEF_P(resultzv)) { + if (stmt->result_bind[i].bound == TRUE) { zval *data = &result->unbuf->last_row_data[i]; /* @@ -1035,11 +1036,11 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned Z_TYPE_P(data), Z_REFCOUNTED(stmt->result_bind[i].zv)? Z_REFCOUNT(stmt->result_bind[i].zv) : 0); - if ((Z_TYPE_P(data) == IS_STRING) && - (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))) { - meta->fields[i].max_length = Z_STRLEN_P(data); + if (zend_try_assign_ex(resultzv, data, 0) == SUCCESS) { + if ((Z_TYPE_P(data) == IS_STRING) && (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))) { + meta->fields[i].max_length = Z_STRLEN_P(data); + } } - zend_try_assign_ex(resultzv, data, 0); /* copied data, thus also the ownership. Thus null data */ ZVAL_NULL(data); } From ae3e7881d6c81a6bf68b96fc60ab13a9f1d1da18 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 15 Aug 2018 12:55:05 +0200 Subject: [PATCH 297/369] Fix a last function to use zend_try_assign() --- ext/xmlrpc/xmlrpc-epi-php.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c index ba7925a88d51..3d0c5e05e0ac 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -1375,15 +1375,19 @@ PHP_FUNCTION(xmlrpc_set_type) size_t type_len; XMLRPC_VALUE_TYPE vtype; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "z/s", &arg, &type, &type_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs", &arg, &type, &type_len) == FAILURE) { return; } vtype = xmlrpc_str_as_type(type); if (vtype != xmlrpc_none) { - if (set_zval_xmlrpc_type(arg, vtype) == SUCCESS) { + zval tmp; + ZVAL_COPY(&tmp, Z_REFVAL_P(arg)); + if (set_zval_xmlrpc_type(tmp, vtype) == SUCCESS) { + zend_try_assign(arg, &tmp); RETURN_TRUE; } + Z_TRY_DELREF(tmp); } else { zend_error(E_WARNING,"invalid type '%s' passed to xmlrpc_set_type()", type); } From 872084b21dd7f06b3e597f1eb24a3ef35b12e0b7 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 15 Aug 2018 13:23:12 +0200 Subject: [PATCH 298/369] Fix non-string key usage with typed properties --- Zend/zend_execute.c | 4 +- Zend/zend_vm_def.h | 16 +++- Zend/zend_vm_execute.h | 180 +++++++++++++++++++++++++++--------- ext/xmlrpc/xmlrpc-epi-php.c | 2 +- 4 files changed, 151 insertions(+), 51 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index c87900222541..22da31d06d26 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2465,7 +2465,9 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (prop_op_type == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(prop_ptr), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(prop_ptr, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(ptr) <= IS_FALSE || (Z_ISREF_P(ptr) && Z_TYPE_P(Z_REFVAL_P(ptr)) == IS_NULL))) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index daa7dd1a1304..4333f6409f7c 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -844,7 +844,9 @@ ZEND_VM_C_LABEL(assign_op_object): 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -1238,7 +1240,9 @@ ZEND_VM_C_LABEL(pre_incdec_object): 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -1305,7 +1309,9 @@ ZEND_VM_C_LABEL(post_incdec_object): 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -2737,7 +2743,9 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C if (OP2_TYPE == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 4061a2fc3977..5290c53f16b9 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -24625,7 +24625,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -25299,7 +25301,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -25365,7 +25369,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -26725,7 +26731,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -26821,7 +26829,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -27543,7 +27553,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -28219,7 +28231,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -28286,7 +28300,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -29592,7 +29608,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -29688,7 +29706,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -32219,7 +32239,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -32742,7 +32764,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -32808,7 +32832,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -34216,7 +34242,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -34312,7 +34340,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -35216,7 +35246,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -35391,7 +35423,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -35457,7 +35491,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -36388,7 +36424,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -36483,7 +36521,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -37239,7 +37279,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -37414,7 +37456,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -37481,7 +37525,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -38415,7 +38461,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -38510,7 +38558,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -39916,7 +39966,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -40091,7 +40143,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -40157,7 +40211,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -41088,7 +41144,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -41183,7 +41241,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -44295,7 +44355,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -44969,7 +45031,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -45035,7 +45099,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -47003,7 +47069,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -47098,7 +47166,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -49043,7 +49113,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -49719,7 +49791,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -49786,7 +49860,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -51319,7 +51395,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -51414,7 +51492,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -56029,7 +56109,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -56552,7 +56634,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -56618,7 +56702,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP 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_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -58252,7 +58338,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -58347,7 +58435,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c index 3d0c5e05e0ac..fd02b3162fe0 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -1383,7 +1383,7 @@ PHP_FUNCTION(xmlrpc_set_type) if (vtype != xmlrpc_none) { zval tmp; ZVAL_COPY(&tmp, Z_REFVAL_P(arg)); - if (set_zval_xmlrpc_type(tmp, vtype) == SUCCESS) { + if (set_zval_xmlrpc_type(&tmp, vtype) == SUCCESS) { zend_try_assign(arg, &tmp); RETURN_TRUE; } From 0d579d0b1afd2c77351f51b1b57ee2be9133ad4c Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 22 Sep 2018 12:57:14 +0200 Subject: [PATCH 299/369] Add test for typed properties with integer keys --- .../typed_properties_086.phpt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_086.phpt 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 000000000000..c58eb7898efe --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_086.phpt @@ -0,0 +1,27 @@ +--TEST-- +Test typed properties with integer keys +--FILE-- +$x = 2; +$t->$x--; + +var_dump($t); + +?> +--EXPECT-- +object(T)#1 (1) { + ["i"]=> + uninitialized(int) + ["1"]=> + int(1) +} From 5ba37d8866c46fa64856021ccd838e9a492c9f7c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 22 Sep 2018 13:06:13 +0200 Subject: [PATCH 300/369] Remove unnecessary EXPECTFs --- Zend/tests/type_declarations/typed_properties_009.phpt | 2 +- Zend/tests/type_declarations/typed_properties_010.phpt | 2 +- Zend/tests/type_declarations/typed_properties_011.phpt | 2 +- Zend/tests/type_declarations/typed_properties_018.phpt | 7 +------ Zend/tests/type_declarations/typed_properties_023.phpt | 2 +- Zend/tests/type_declarations/typed_properties_027.phpt | 9 +-------- Zend/tests/type_declarations/typed_properties_032.phpt | 2 +- Zend/tests/type_declarations/typed_properties_034.phpt | 2 +- Zend/tests/type_declarations/typed_properties_036.phpt | 2 +- Zend/tests/type_declarations/typed_properties_041.phpt | 9 +-------- Zend/tests/type_declarations/typed_properties_075.phpt | 2 +- 11 files changed, 11 insertions(+), 30 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_009.phpt b/Zend/tests/type_declarations/typed_properties_009.phpt index 83ccfcf515e4..24013b411806 100644 --- a/Zend/tests/type_declarations/typed_properties_009.phpt +++ b/Zend/tests/type_declarations/typed_properties_009.phpt @@ -18,6 +18,6 @@ unset($foo->bar); var_dump($foo->bar); ?> ---EXPECTF-- +--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 index 8b5cc049825d..fd7d367fea3a 100644 --- a/Zend/tests/type_declarations/typed_properties_010.phpt +++ b/Zend/tests/type_declarations/typed_properties_010.phpt @@ -13,5 +13,5 @@ $cb = function(int &$bar) { $foo = new Foo(); $cb($foo->bar); ?> ---EXPECTF-- +--EXPECT-- int(1) diff --git a/Zend/tests/type_declarations/typed_properties_011.phpt b/Zend/tests/type_declarations/typed_properties_011.phpt index 074327ff26a8..706a33275054 100644 --- a/Zend/tests/type_declarations/typed_properties_011.phpt +++ b/Zend/tests/type_declarations/typed_properties_011.phpt @@ -11,7 +11,7 @@ $foo = new Foo(); $array = [&$foo->bar]; var_dump($array); ?> ---EXPECTF-- +--EXPECT-- array(1) { [0]=> &int(1) diff --git a/Zend/tests/type_declarations/typed_properties_018.phpt b/Zend/tests/type_declarations/typed_properties_018.phpt index 54fd38dc9164..097b39b232bf 100644 --- a/Zend/tests/type_declarations/typed_properties_018.phpt +++ b/Zend/tests/type_declarations/typed_properties_018.phpt @@ -13,10 +13,5 @@ $prop = $reflector->getProperty("qux"); var_dump((string) $prop->getType()); ?> ---EXPECTF-- +--EXPECT-- string(3) "int" - - - - - diff --git a/Zend/tests/type_declarations/typed_properties_023.phpt b/Zend/tests/type_declarations/typed_properties_023.phpt index 320a7bc8b590..0251d335acdc 100644 --- a/Zend/tests/type_declarations/typed_properties_023.phpt +++ b/Zend/tests/type_declarations/typed_properties_023.phpt @@ -32,7 +32,7 @@ Foo::$s = ref(); var_dump(Foo::$s); var_dump(ref()); ?> ---EXPECTF-- +--EXPECT-- string(1) "x" int(1) int(1) diff --git a/Zend/tests/type_declarations/typed_properties_027.phpt b/Zend/tests/type_declarations/typed_properties_027.phpt index 03ce2f15893e..861769932cb8 100644 --- a/Zend/tests/type_declarations/typed_properties_027.phpt +++ b/Zend/tests/type_declarations/typed_properties_027.phpt @@ -12,12 +12,5 @@ $foo->bar = 10; var_dump($foo->bar); ?> ---EXPECTF-- +--EXPECT-- float(10) - - - - - - - diff --git a/Zend/tests/type_declarations/typed_properties_032.phpt b/Zend/tests/type_declarations/typed_properties_032.phpt index 017e18eceeff..f3ceeb5cd919 100644 --- a/Zend/tests/type_declarations/typed_properties_032.phpt +++ b/Zend/tests/type_declarations/typed_properties_032.phpt @@ -11,5 +11,5 @@ $foo = new class { }; var_dump($foo->method()); ---EXPECTF-- +--EXPECT-- int(15) diff --git a/Zend/tests/type_declarations/typed_properties_034.phpt b/Zend/tests/type_declarations/typed_properties_034.phpt index d0ecd6d32285..9fd14d6ec27b 100644 --- a/Zend/tests/type_declarations/typed_properties_034.phpt +++ b/Zend/tests/type_declarations/typed_properties_034.phpt @@ -36,7 +36,7 @@ try { var_dump($foo); ?> ---EXPECTF-- +--EXPECT-- int(42) Typed property class@anonymous::$baz must be int, null used int(1) diff --git a/Zend/tests/type_declarations/typed_properties_036.phpt b/Zend/tests/type_declarations/typed_properties_036.phpt index e98c8817a696..edb87a38e07a 100644 --- a/Zend/tests/type_declarations/typed_properties_036.phpt +++ b/Zend/tests/type_declarations/typed_properties_036.phpt @@ -10,6 +10,6 @@ foreach ($foo as $key => $bar) { var_dump($key, $bar); } ?> ---EXPECTF-- +--EXPECT-- string(3) "bar" int(10) diff --git a/Zend/tests/type_declarations/typed_properties_041.phpt b/Zend/tests/type_declarations/typed_properties_041.phpt index 8e8c856ee309..76dbfd8f5d9a 100644 --- a/Zend/tests/type_declarations/typed_properties_041.phpt +++ b/Zend/tests/type_declarations/typed_properties_041.phpt @@ -12,12 +12,5 @@ $foo->bar = "10"; var_dump($foo->bar); ?> ---EXPECTF-- +--EXPECT-- int(10) - - - - - - - diff --git a/Zend/tests/type_declarations/typed_properties_075.phpt b/Zend/tests/type_declarations/typed_properties_075.phpt index 568b72ea4290..b015234b6035 100644 --- a/Zend/tests/type_declarations/typed_properties_075.phpt +++ b/Zend/tests/type_declarations/typed_properties_075.phpt @@ -42,7 +42,7 @@ try { var_dump(Foo::$bar); ?> ---EXPECTF-- +--EXPECT-- string(48) "Typed property Foo::$bar must be int, float used" int(9223372036854775807) string(48) "Typed property Foo::$bar must be int, float used" From aa9a8dda7c44c0e5a79339c8b2956b411ebd08bb Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 22 Sep 2018 13:07:46 +0200 Subject: [PATCH 301/369] One more EXPECTF case --- Zend/tests/type_declarations/typed_properties_069.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/tests/type_declarations/typed_properties_069.phpt b/Zend/tests/type_declarations/typed_properties_069.phpt index 946c316296d0..fa1f60ce8461 100644 --- a/Zend/tests/type_declarations/typed_properties_069.phpt +++ b/Zend/tests/type_declarations/typed_properties_069.phpt @@ -21,7 +21,7 @@ try { var_dump(nonNumericStringRef()); ?> ---EXPECTF-- +--EXPECT-- Typed property Foo::$i must be int, string used Typed static property Foo::$i must not be accessed before initialization string(1) "x" From 8e0380b7bb427b2df322ce4333a05fab9fd45663 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 22 Sep 2018 17:18:02 +0200 Subject: [PATCH 302/369] Use seen_prop when reporting weak type error Doesn't really matter (just a different "equivalent" property used for the report), but that's what was intended here... --- Zend/zend_execute.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 31b7d8c50e99..2e6f299f2f4e 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2817,7 +2817,7 @@ static zend_always_inline zend_bool i_zend_verify_ref_assignable_zval(zend_refer } 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(prop, zv); + zend_throw_ref_type_error_zval(seen_prop, zv); return 0; } From f1a25229c9980d26db021dfa16c9026af495c0e0 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 22 Sep 2018 17:51:39 +0200 Subject: [PATCH 303/369] Add test for settype() on typed reference Apparently I did not git add this file. --- .../settype_typed_property.phpt | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 ext/standard/tests/general_functions/settype_typed_property.phpt diff --git a/ext/standard/tests/general_functions/settype_typed_property.phpt b/ext/standard/tests/general_functions/settype_typed_property.phpt new file mode 100644 index 000000000000..a987a4167077 --- /dev/null +++ b/ext/standard/tests/general_functions/settype_typed_property.phpt @@ -0,0 +1,28 @@ +--TEST-- +Using settype() on a typed property +--FILE-- +x = 42; +settype($test->x, 'string'); +// Same as $test->x = (string) $test->x. +// Leaves value unchanged due to coercion +var_dump($test->x); + +try { + settype($test->x, 'array'); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test->x); + +?> +--EXPECT-- +int(42) +Cannot assign array to reference held by property Test->x of type int +int(42) From 8df6714194d337baced64ef9dbc8393594fd2eae Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 23 Sep 2018 15:05:33 +0200 Subject: [PATCH 304/369] Minor test improvements Remove some duplicate tests, unnecessary catches, fix typos, etc. --- .../typed_properties_023.phpt | 1 - .../typed_properties_024.phpt | 4 +- .../typed_properties_025.phpt | 4 +- .../typed_properties_042.phpt | 4 -- .../typed_properties_043.phpt | 24 -------- .../typed_properties_047.phpt | 40 ++++--------- .../typed_properties_048.phpt | 60 ------------------- .../typed_properties_058.phpt | 8 +-- .../tests/type_declarations/types_in_ast.phpt | 2 +- 9 files changed, 18 insertions(+), 129 deletions(-) delete mode 100644 Zend/tests/type_declarations/typed_properties_043.phpt delete mode 100644 Zend/tests/type_declarations/typed_properties_048.phpt diff --git a/Zend/tests/type_declarations/typed_properties_023.phpt b/Zend/tests/type_declarations/typed_properties_023.phpt index 0251d335acdc..e48ae3c073e0 100644 --- a/Zend/tests/type_declarations/typed_properties_023.phpt +++ b/Zend/tests/type_declarations/typed_properties_023.phpt @@ -20,7 +20,6 @@ var_dump(Foo::$i); Foo::$s = Foo::$i++; var_dump(Foo::$s, Foo::$i); $a = 3; -$b = "3"; Foo::$s = $a; var_dump(Foo::$s); Foo::$i = "4"; diff --git a/Zend/tests/type_declarations/typed_properties_024.phpt b/Zend/tests/type_declarations/typed_properties_024.phpt index d38fe249534b..6f23b0bb2601 100644 --- a/Zend/tests/type_declarations/typed_properties_024.phpt +++ b/Zend/tests/type_declarations/typed_properties_024.phpt @@ -6,7 +6,9 @@ class Foo { private int $thing; } -class Bar extends Foo {} +class Bar extends Foo { + public string $thing; // No conflict +} echo "ok"; ?> diff --git a/Zend/tests/type_declarations/typed_properties_025.phpt b/Zend/tests/type_declarations/typed_properties_025.phpt index 70156de35b8f..3dd244a7de86 100644 --- a/Zend/tests/type_declarations/typed_properties_025.phpt +++ b/Zend/tests/type_declarations/typed_properties_025.phpt @@ -3,8 +3,8 @@ Test typed properties type must preceed first declaration in group --FILE-- --EXPECTF-- diff --git a/Zend/tests/type_declarations/typed_properties_042.phpt b/Zend/tests/type_declarations/typed_properties_042.phpt index 0d1f45943aac..ecb3df3c11dc 100644 --- a/Zend/tests/type_declarations/typed_properties_042.phpt +++ b/Zend/tests/type_declarations/typed_properties_042.phpt @@ -1,9 +1,5 @@ --TEST-- Proper source duplication on assignment to typed property ---INI-- -opcache.enable=1 -opcache.enable_cli=1 -opcache.protect_memory=1 --FILE-- bar = "5"; - var_dump($foo->bar); -} -?> ---EXPECT-- -int(5) -int(5) -int(5) -int(5) -int(5) diff --git a/Zend/tests/type_declarations/typed_properties_047.phpt b/Zend/tests/type_declarations/typed_properties_047.phpt index 9267f53047ae..7f1e573cd3a1 100644 --- a/Zend/tests/type_declarations/typed_properties_047.phpt +++ b/Zend/tests/type_declarations/typed_properties_047.phpt @@ -5,38 +5,18 @@ Nullable typed property class Foo { public ?int $foo = null; } + $x = new Foo(); var_dump($x); -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - $x->foo = 5; -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - $x->foo = null; -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - unset($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} +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) { diff --git a/Zend/tests/type_declarations/typed_properties_048.phpt b/Zend/tests/type_declarations/typed_properties_048.phpt deleted file mode 100644 index 9267f53047ae..000000000000 --- a/Zend/tests/type_declarations/typed_properties_048.phpt +++ /dev/null @@ -1,60 +0,0 @@ ---TEST-- -Nullable typed property ---FILE-- -foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - $x->foo = 5; -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - $x->foo = null; -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - unset($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - $x->foo = "ops"; -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -?> ---EXPECTF-- -object(Foo)#1 (1) { - ["foo"]=> - NULL -} -NULL -int(5) -NULL -Typed property Foo::$foo must not be accessed before initialization -Typed property Foo::$foo must be int or null, string used diff --git a/Zend/tests/type_declarations/typed_properties_058.phpt b/Zend/tests/type_declarations/typed_properties_058.phpt index 007fbd3d0b5d..09a21435c4f0 100644 --- a/Zend/tests/type_declarations/typed_properties_058.phpt +++ b/Zend/tests/type_declarations/typed_properties_058.phpt @@ -14,12 +14,8 @@ class B { public string $foo = FOO; } -try { - $o = new A(); - var_dump($o->foo); -} catch (Throwable $e) { - echo $e->getMessage() . "\n"; -} +$o = new A(); +var_dump($o->foo); for ($i = 0; $i < 2; $i++) { try { diff --git a/Zend/tests/type_declarations/types_in_ast.phpt b/Zend/tests/type_declarations/types_in_ast.phpt index 61268fdf91f3..54619c23b712 100644 --- a/Zend/tests/type_declarations/types_in_ast.phpt +++ b/Zend/tests/type_declarations/types_in_ast.phpt @@ -1,5 +1,5 @@ --TEST-- -AST pretty-peinter +AST pretty-printer --INI-- zend.assertions=1 assert.exception=0 From 96ea906847238fcbf02639726e6bb4823fc0df9a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 23 Sep 2018 15:07:15 +0200 Subject: [PATCH 305/369] Drop redundant "Typed" prefix from callable/void error --- Zend/tests/type_declarations/typed_properties_017.phpt | 2 +- Zend/tests/type_declarations/typed_properties_053.phpt | 2 +- Zend/tests/type_declarations/typed_properties_054.phpt | 2 +- Zend/zend_compile.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_017.phpt b/Zend/tests/type_declarations/typed_properties_017.phpt index 16de52ea12e8..3e501d3688bd 100644 --- a/Zend/tests/type_declarations/typed_properties_017.phpt +++ b/Zend/tests/type_declarations/typed_properties_017.phpt @@ -9,4 +9,4 @@ class Foo { $foo = new Foo(); ?> --EXPECTF-- -Fatal error: Typed property Foo::$int cannot have type void in %s on line 3 +Fatal error: Property Foo::$int cannot have type void in %s on line 3 diff --git a/Zend/tests/type_declarations/typed_properties_053.phpt b/Zend/tests/type_declarations/typed_properties_053.phpt index e9635cd448e6..1da42bcbd970 100644 --- a/Zend/tests/type_declarations/typed_properties_053.phpt +++ b/Zend/tests/type_declarations/typed_properties_053.phpt @@ -9,4 +9,4 @@ $obj = new A; var_dump($obj); ?> --EXPECTF-- -Fatal error: Typed property A::$a cannot have type callable in %s on line %d +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 index ffdde768de17..38de9815edff 100644 --- a/Zend/tests/type_declarations/typed_properties_054.phpt +++ b/Zend/tests/type_declarations/typed_properties_054.phpt @@ -9,4 +9,4 @@ $obj = new A; var_dump($obj); ?> --EXPECTF-- -Fatal error: Typed property A::$a cannot have type callable in %s on line %d +Fatal error: Property A::$a cannot have type callable in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 88fbcf062a2c..053bdbc40965 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6069,7 +6069,7 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ if (optional_type == IS_VOID || optional_type == IS_CALLABLE) { zend_error_noreturn(E_COMPILE_ERROR, - "Typed property %s::$%s cannot have type %s", + "Property %s::$%s cannot have type %s", ZSTR_VAL(ce->name), ZSTR_VAL(name), zend_get_type_by_const(optional_type)); From 494585f0ed8acd7c59ceaae7b79364542f8c0377 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 23 Sep 2018 15:59:40 +0200 Subject: [PATCH 306/369] Restore old zend_binary_assign_op_obj_dim code Remove the special treatment of references. --- .../typed_properties_065.phpt | 20 ++++++++-------- Zend/zend_execute.c | 24 ++++--------------- 2 files changed, 14 insertions(+), 30 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_065.phpt b/Zend/tests/type_declarations/typed_properties_065.phpt index 78276a9d9a10..7e3c61bc638a 100644 --- a/Zend/tests/type_declarations/typed_properties_065.phpt +++ b/Zend/tests/type_declarations/typed_properties_065.phpt @@ -8,7 +8,7 @@ $a = new class implements ArrayAccess { function offsetExists($o) { return 1; } function &offsetGet($o) { return $this->foo; } - function offsetSet($o, $v) { print "offsetSet() must not be called"; } + function offsetSet($o, $v) { print "offsetSet($v)\n"; } function offsetUnset($o) { print "offsetUnset() ?!?"; } }; @@ -18,9 +18,7 @@ var_dump($a->foo); $a[0] .= "1"; var_dump($a->foo); -try { - $a[0] .= "e50"; -} catch (Error $e) { echo $e->getMessage(), "\n"; } +$a[0] .= "e50"; var_dump($a->foo); $a[0]--; @@ -43,12 +41,14 @@ echo gettype($a->foo),"\n"; ?> --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) +offsetSet(2) +int(1) +offsetSet(11) +int(1) +offsetSet(1e50) +int(1) +int(0) +int(-1) Cannot assign float to reference held by property class@anonymous->foo of type int integer Cannot assign float to reference held by property class@anonymous->foo of type int diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 2e6f299f2f4e..4b5510eb11a8 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1248,31 +1248,15 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval * } ZVAL_COPY_VALUE(z, value); } - if (UNEXPECTED(Z_ISREF_P(z))) { - zend_reference *ref = Z_REF_P(z); - zval *refval = Z_REFVAL_P(z); - binary_op(&res, refval, value); - if (ZEND_REF_HAS_TYPE_SOURCES(ref) && !zend_verify_ref_assignable_zval(ref, &res, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { - zval_ptr_dtor(&res); - if (z == &rv) { - zval_ptr_dtor(&rv); - } - return; - } - zval_ptr_dtor(refval); - ZVAL_COPY(refval, &res); - } else { - binary_op(&res, z, value); - Z_OBJ_HT_P(object)->write_dimension(object, property, &res); - } + binary_op(&res, Z_ISREF_P(z) ? Z_REFVAL_P(z) : z, value); + Z_OBJ_HT_P(object)->write_dimension(object, property, &res); if (z == &rv) { zval_ptr_dtor(&rv); } if (retval) { - ZVAL_COPY_VALUE(retval, &res); - } else { - zval_ptr_dtor(&res); + ZVAL_COPY(retval, &res); } + zval_ptr_dtor(&res); } else { zend_use_object_as_array(); if (retval) { From e8cf0050b27abbcfaab541c4119baaec1963cd9f Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 23 Sep 2018 17:42:01 +0200 Subject: [PATCH 307/369] Revert some unnecessary changes --- Zend/zend_API.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index df525d8807e6..2cc3bd709db8 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -795,6 +795,12 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons zend_parse_arg_zval_deref(real_arg, p, check_null); } break; + + case 'Z': + /* 'Z' iz not supported anymore and should be replaced with 'z' */ + ZEND_ASSERT(c != 'Z'); + default: + return "unknown"; } *spec = spec_walk; @@ -878,12 +884,12 @@ static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va, case 's': case 'b': case 'r': case 'a': case 'o': case 'O': + case 'z': case 'Z': case 'C': case 'h': case 'f': case 'A': case 'H': case 'p': case 'S': case 'P': - case 'L': case 't': - case 'z': + case 'L': max_num_args++; break; @@ -1144,7 +1150,6 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */ if (class_type->parent) { if (UNEXPECTED(zend_update_class_constants(class_type->parent) != SUCCESS)) { - class_type->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; return FAILURE; } } From c44eba9c6ad492dd59bda5c8ca2850cced16fadc Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 24 Sep 2018 06:05:11 +0200 Subject: [PATCH 308/369] Change zend_declare_typed_property to accept zend_type Also cleanup zend_compile_assign_ref --- Zend/zend_API.c | 14 +++------ Zend/zend_API.h | 2 +- Zend/zend_compile.c | 65 ++++++++++++++++++----------------------- Zend/zend_compile.h | 4 +-- Zend/zend_inheritance.c | 9 +----- 5 files changed, 37 insertions(+), 57 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 2cc3bd709db8..8c896b8905ca 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3692,11 +3692,11 @@ static inline zend_string *zval_make_interned_string(zval *zv) /* {{{ */ return Z_STR_P(zv); } -ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment, zend_uchar optional_type, zend_string *optional_type_name, zend_bool allow_null) /* {{{ */ +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 (optional_type && (access_type & ZEND_ACC_STATIC) == 0) { + if (ZEND_TYPE_IS_SET(type) && (access_type & ZEND_ACC_STATIC) == 0) { ce->ce_flags |= ZEND_ACC_HAS_TYPE_HINTS; } @@ -3771,13 +3771,7 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name property_info->flags = access_type; property_info->doc_comment = doc_comment; property_info->ce = ce; - if (optional_type_name) { - property_info->type = ZEND_TYPE_ENCODE_CLASS(zend_new_interned_string(optional_type_name), allow_null); - } else if (optional_type) { - property_info->type = ZEND_TYPE_ENCODE(optional_type, allow_null); - } else { - property_info->type = 0; - } + property_info->type = type; zend_hash_update_ptr(&ce->properties_info, name, property_info); @@ -3787,7 +3781,7 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name 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, NULL, 0); + return zend_declare_typed_property(ce, name, property, access_type, doc_comment, 0); } /* }}} */ diff --git a/Zend/zend_API.h b/Zend/zend_API.h index cee1359c7260..227470dad9ab 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -313,7 +313,7 @@ ZEND_API zend_bool zend_make_callable(zval *callable, zend_string **callable_nam 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_uchar type, zend_string *type_name, zend_bool allow_null); +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); diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 053bdbc40965..3a0b36b985c8 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2604,7 +2604,7 @@ static zend_op *zend_compile_prop(znode *result, zend_ast *ast, uint32_t type, i { uint32_t offset = zend_delayed_compile_begin(); zend_op *opline = zend_delayed_compile_prop(result, ast, type); - if (by_ref && (type == BP_VAR_W || type == BP_VAR_FUNC_ARG)) { /* shared with cache_slot */ + if (by_ref) { /* shared with cache_slot */ opline->extended_value |= ZEND_FETCH_REF; } return zend_delayed_compile_end(offset); @@ -2967,7 +2967,7 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ zend_ast *target_ast = ast->child[0]; zend_ast *source_ast = ast->child[1]; - znode target_node, source_node; + znode source_node; zend_op *opline; uint32_t offset; @@ -2977,7 +2977,7 @@ 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, 1); + zend_delayed_compile_var(result, target_ast, BP_VAR_W, 1); zend_compile_var(&source_node, source_ast, BP_VAR_W, 1); if ((target_ast->kind != ZEND_AST_VAR @@ -2992,23 +2992,20 @@ 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 = &CG(active_op_array)->opcodes[CG(active_op_array)->last - 1]; - if (target_node.op_type == IS_VAR && opline->opcode == ZEND_FETCH_OBJ_W) { + if (opline && opline->opcode == ZEND_FETCH_OBJ_W) { opline->opcode = ZEND_ASSIGN_OBJ_REF; - zend_make_var_result(result, opline); zend_emit_op_data(&source_node); - } else if (target_node.op_type == IS_VAR && opline->opcode == ZEND_FETCH_STATIC_PROP_W) { + } else if (opline && opline->opcode == ZEND_FETCH_STATIC_PROP_W) { opline->opcode = ZEND_ASSIGN_STATIC_PROP_REF; - zend_make_var_result(result, opline); zend_emit_op_data(&source_node); } else { - opline = zend_emit_op(result, ZEND_ASSIGN_REF, &target_node, &source_node); + opline = zend_emit_op(result, ZEND_ASSIGN_REF, result, &source_node); opline->extended_value = 0; } @@ -6027,9 +6024,8 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ zend_string *name = zval_make_interned_string(zend_ast_get_zval(name_ast)); zend_string *doc_comment = NULL; zval value_zv; - zend_uchar optional_type = 0; zend_bool allow_null = 0; - zend_string *optional_type_name = NULL; + zend_type type = 0; if (type_ast) { if (type_ast->attr & ZEND_TYPE_NULLABLE) { @@ -6038,19 +6034,19 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ } if (type_ast->kind == ZEND_AST_TYPE) { - optional_type = type_ast->attr; + type = ZEND_TYPE_ENCODE(type_ast->attr, allow_null); } else { zend_string *class_name = zend_ast_get_str(type_ast); - zend_uchar type = zend_lookup_builtin_type_by_name(class_name); + zend_uchar typeinfo = zend_lookup_builtin_type_by_name(class_name); - if (type != 0) { + if (typeinfo != 0) { if (type_ast->attr != ZEND_NAME_NOT_FQ) { zend_error_noreturn(E_COMPILE_ERROR, "Scalar type declaration '%s' must be unqualified", ZSTR_VAL(zend_string_tolower(class_name))); } - optional_type = type; + type = ZEND_TYPE_ENCODE(typeinfo, allow_null); } else { uint32_t fetch_type = zend_get_class_fetch_type_ast(type_ast); @@ -6062,17 +6058,16 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ zend_string_addref(class_name); } - optional_type = IS_OBJECT; - optional_type_name = class_name; + type = ZEND_TYPE_ENCODE_CLASS(zend_new_interned_string(class_name), allow_null); } } - if (optional_type == IS_VOID || optional_type == IS_CALLABLE) { + 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(optional_type)); + zend_get_type_by_const(ZEND_TYPE_CODE(type))); } } @@ -6095,46 +6090,44 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ if (value_ast) { zend_const_expr_to_zval(&value_zv, value_ast); - if (optional_type && !Z_CONSTANT(value_zv)) { + if (ZEND_TYPE_IS_SET(type) && !Z_CONSTANT(value_zv)) { if (Z_TYPE(value_zv) == IS_NULL) { - if (!allow_null) { - const char *name = optional_type_name - ? ZSTR_VAL(optional_type_name) : zend_get_type_by_const(optional_type); + 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 (optional_type_name || optional_type == IS_OBJECT) { - const char *name = optional_type_name - ? ZSTR_VAL(optional_type_name) : zend_get_type_by_const(optional_type); + } else if (ZEND_TYPE_IS_CLASS(type)) { zend_error_noreturn(E_COMPILE_ERROR, - "Property of type %s may not have default value", name); - } else if (optional_type == IS_ARRAY || optional_type == IS_ITERABLE) { + "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(optional_type)); + zend_get_type_by_const(ZEND_TYPE_CODE(type))); } - } else if (optional_type == IS_DOUBLE) { + } else if (ZEND_TYPE_CODE(type) == IS_DOUBLE) { if (Z_TYPE(value_zv) != IS_DOUBLE && Z_TYPE(value_zv) != IS_LONG) { zend_error_noreturn(E_COMPILE_ERROR, "Default value for property of type float can only be float or int"); } - } else if (!ZEND_SAME_FAKE_TYPE(optional_type, Z_TYPE(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(optional_type), - zend_get_type_by_const(optional_type)); + zend_get_type_by_const(ZEND_TYPE_CODE(type)), + zend_get_type_by_const(ZEND_TYPE_CODE(type))); } } - } else if (!optional_type) { + } else if (!ZEND_TYPE_IS_SET(type)) { ZVAL_NULL(&value_zv); } else { ZVAL_UNDEF(&value_zv); } - zend_declare_typed_property(ce, name, &value_zv, flags, doc_comment, optional_type, optional_type_name, allow_null); + zend_declare_typed_property(ce, name, &value_zv, flags, doc_comment, type); } } /* }}} */ diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 0d65397cd924..f21257a6ece6 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -220,7 +220,7 @@ typedef struct _zend_oparray_context { /* Function has typed arguments / class has typed props | | | */ #define ZEND_ACC_HAS_TYPE_HINTS (1 << 7) /* X | X | | */ /* | | | */ -/* Class Flags (unused: 16...) | | | */ +/* Class Flags (unused: 14...) | | | */ /* =========== | | | */ /* | | | */ /* Special class types | | | */ @@ -252,7 +252,7 @@ typedef struct _zend_oparray_context { /* | | | */ /* Class has magic methods __get/__set/__unset/ | | | */ /* __isset that use guards | | | */ -#define ZEND_ACC_USE_GUARDS (1 << 15) /* X | | | */ +#define ZEND_ACC_USE_GUARDS (1 << 13) /* X | | | */ /* | | | */ /* Function Flags (unused: 25...30) | | | */ /* ============== | | | */ diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 410239659344..aff109ba15a1 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -1783,14 +1783,7 @@ static void zend_do_traits_property_binding(zend_class_entry *ce, zend_class_ent Z_TRY_ADDREF_P(prop_value); doc_comment = property_info->doc_comment ? zend_string_copy(property_info->doc_comment) : NULL; - if (property_info->type) { - zend_declare_typed_property(ce, prop_name, prop_value, flags, doc_comment, - ZEND_TYPE_IS_CODE(property_info->type) ? ZEND_TYPE_CODE(property_info->type) : 0, - ZEND_TYPE_IS_CLASS(property_info->type) ? ZEND_TYPE_IS_CE(property_info->type) ? ZEND_TYPE_CE(property_info->type)->name : ZEND_TYPE_NAME(property_info->type) : NULL, - ZEND_TYPE_ALLOW_NULL(property_info->type)); - } else { - zend_declare_property_ex(ce, prop_name, prop_value, flags, doc_comment); - } + zend_declare_typed_property(ce, prop_name, prop_value, flags, doc_comment, property_info->type); zend_string_release_ex(prop_name, 0); } ZEND_HASH_FOREACH_END(); } From 7424833a44f349f8c01d2c54588a45079228e9ce Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 24 Sep 2018 06:20:11 +0200 Subject: [PATCH 309/369] Fix parent private property type affecting child class --- .../typed_properties_048.phpt | 17 +++++++++++ Zend/zend_inheritance.c | 28 +++++++------------ 2 files changed, 27 insertions(+), 18 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_048.phpt 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 000000000000..8a06c55f2360 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_048.phpt @@ -0,0 +1,17 @@ +--TEST-- +Parent private property types must be ignored +--FILE-- +prop; })->call(new B)); + +?> +--EXPECT-- +int(2) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index aff109ba15a1..dd0e79bb38d9 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -743,34 +743,26 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke ZVAL_UNDEF(&ce->default_properties_table[child_num]); child_info->offset = parent_info->offset; } - } - if (UNEXPECTED(ZEND_TYPE_IS_SET(parent_info->type) && !(parent_info->flags & ZEND_ACC_PRIVATE))) { - if (ZEND_TYPE_IS_CLASS(parent_info->type)) { - if (!property_types_compatible(parent_info, child_info)) { + if (UNEXPECTED(ZEND_TYPE_IS_SET(parent_info->type))) { + if (ZEND_TYPE_IS_CLASS(parent_info->type) ? !property_types_compatible(parent_info, child_info) : parent_info->type != child_info->type) { zend_error_noreturn(E_COMPILE_ERROR, "Type of %s::$%s must be %s%s (as in class %s)", ZSTR_VAL(ce->name), ZSTR_VAL(key), ZEND_TYPE_ALLOW_NULL(parent_info->type) ? "?" : "", - ZSTR_VAL(ZEND_TYPE_IS_CE(parent_info->type) ? ZEND_TYPE_CE(parent_info->type)->name : zend_resolve_property_type(ZEND_TYPE_NAME(parent_info->type), parent_info->ce)), + ZEND_TYPE_IS_CLASS(parent_info->type) + ? ZSTR_VAL(ZEND_TYPE_IS_CE(parent_info->type) ? ZEND_TYPE_CE(parent_info->type)->name : zend_resolve_property_type(ZEND_TYPE_NAME(parent_info->type), parent_info->ce)) + : zend_get_type_by_const(ZEND_TYPE_CODE(parent_info->type)), ZSTR_VAL(ce->parent->name)); } - } else if (parent_info->type != child_info->type) { + } 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 be %s%s (as in class %s)", - ZSTR_VAL(ce->name), - ZSTR_VAL(key), - ZEND_TYPE_ALLOW_NULL(parent_info->type) ? "?" : "", - zend_get_type_by_const(ZEND_TYPE_CODE(parent_info->type)), - ZSTR_VAL(ce->parent->name)); + "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(ZEND_TYPE_IS_SET(child_info->type) && !ZEND_TYPE_IS_SET(parent_info->type))) { - zend_error_noreturn(E_COMPILE_ERROR, - "Type of %s::$%s must not be defined (as in class %s)", - ZSTR_VAL(ce->name), - ZSTR_VAL(key), - ZSTR_VAL(ce->parent->name)); } } else { if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) { From aa769fb021b00f9d0fc76c00598b5a59ff785da0 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 24 Sep 2018 06:31:11 +0200 Subject: [PATCH 310/369] Remove redundant ISUNDEF checks in mysqlnd --- ext/mysqlnd/mysqlnd_ps.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c index 46df8d2dfc37..764dfcf523fd 100644 --- a/ext/mysqlnd/mysqlnd_ps.c +++ b/ext/mysqlnd/mysqlnd_ps.c @@ -763,7 +763,7 @@ mysqlnd_stmt_fetch_row_buffered(MYSQLND_RES * result, void * param, const unsign for (i = 0; i < result->field_count; i++) { /* copy the type */ zval *resultzv = &stmt->result_bind[i].zv; - if (stmt->result_bind[i].bound == TRUE && !Z_ISUNDEF_P(resultzv)) { + if (stmt->result_bind[i].bound == TRUE) { DBG_INF_FMT("i=%u type=%u", i, Z_TYPE(current_row[i])); Z_TRY_ADDREF(current_row[i]); zend_try_assign_ex(resultzv, ¤t_row[i], 0); @@ -847,7 +847,7 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES * result, void * param, const unsi for (i = 0; i < field_count; i++) { zval *resultzv = &stmt->result_bind[i].zv; - if (stmt->result_bind[i].bound == TRUE && !Z_ISUNDEF_P(resultzv)) { + if (stmt->result_bind[i].bound == TRUE) { zval *data = &result->unbuf->last_row_data[i]; if (Z_TYPE_P(data) == IS_STRING && (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))){ From eff6b111df5b6f5a7240e67c1ae1332881e73499 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 24 Sep 2018 18:14:54 +0200 Subject: [PATCH 311/369] Handle NULL result in assign_ref --- Zend/zend_compile.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 3a0b36b985c8..9471a5aae83a 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2967,7 +2967,7 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ zend_ast *target_ast = ast->child[0]; zend_ast *source_ast = ast->child[1]; - znode source_node; + znode target_node, source_node; zend_op *opline; uint32_t offset; @@ -2977,7 +2977,7 @@ 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(result, target_ast, BP_VAR_W, 1); + 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 @@ -3001,11 +3001,17 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ if (opline && opline->opcode == ZEND_FETCH_OBJ_W) { opline->opcode = ZEND_ASSIGN_OBJ_REF; zend_emit_op_data(&source_node); + if (result != NULL) { + *result = target_node; + } } else if (opline && opline->opcode == ZEND_FETCH_STATIC_PROP_W) { opline->opcode = ZEND_ASSIGN_STATIC_PROP_REF; zend_emit_op_data(&source_node); + if (result != NULL) { + *result = target_node; + } } else { - opline = zend_emit_op(result, ZEND_ASSIGN_REF, result, &source_node); + opline = zend_emit_op(result, ZEND_ASSIGN_REF, &target_node, &source_node); opline->extended_value = 0; } From 1147467e498dde03d79852336ba9f4f16c9b9645 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 24 Sep 2018 18:36:25 +0200 Subject: [PATCH 312/369] Fix DateInterval write_property handler --- ext/date/php_date.c | 2 -- .../tests/DateInterval_write_property_return.phpt | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 ext/date/tests/DateInterval_write_property_return.phpt diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 98a1ed8ddb59..6a452e915708 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -4232,7 +4232,6 @@ zval *date_interval_write_property(zval *object, zval *member, zval *value, void #define SET_VALUE_FROM_STRUCT(n,m) \ if (strcmp(Z_STRVAL_P(member), m) == 0) { \ obj->diff->n = zval_get_long(value); \ - ZVAL_LONG(value, obj->diff->n); \ break; \ } @@ -4245,7 +4244,6 @@ zval *date_interval_write_property(zval *object, zval *member, zval *value, void SET_VALUE_FROM_STRUCT(s, "s"); if (strcmp(Z_STRVAL_P(member), "f") == 0) { obj->diff->us = zval_get_double(value) * 1000000; - ZVAL_LONG(value, obj->diff->us); break; } SET_VALUE_FROM_STRUCT(invert, "invert"); diff --git a/ext/date/tests/DateInterval_write_property_return.phpt b/ext/date/tests/DateInterval_write_property_return.phpt new file mode 100644 index 000000000000..9c2c5c9137ba --- /dev/null +++ b/ext/date/tests/DateInterval_write_property_return.phpt @@ -0,0 +1,14 @@ +--TEST-- +Test that return value handling for DateInterval property writes do not corrupt RHS +--FILE-- +f = $f); +var_dump($f); + +?> +--EXPECT-- +float(0.5) +float(0.5) From 236a72f1e66f48910326ea466a3547a097d4b580 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 24 Sep 2018 21:47:22 +0200 Subject: [PATCH 313/369] Cleanup tests and improve a few error messages --- .../typed_properties_003.phpt | 2 +- .../typed_properties_033.phpt | 2 +- .../typed_properties_034.phpt | 2 +- .../typed_properties_037.phpt | 2 +- .../typed_properties_038.phpt | 8 +- .../typed_properties_044.phpt | 4 +- .../typed_properties_045.phpt | 4 +- .../typed_properties_055.phpt | 4 +- .../typed_properties_062.phpt | 8 +- .../typed_properties_063.phpt | 8 +- .../typed_properties_064.phpt | 8 +- .../typed_properties_065.phpt | 4 +- .../typed_properties_068.phpt | 41 ++---- .../typed_properties_078.phpt | 4 +- .../typed_properties_081.phpt | 2 +- .../typed_properties_083.phpt | 8 +- Zend/zend_execute.c | 31 +++-- Zend/zend_vm_def.h | 4 +- Zend/zend_vm_execute.h | 128 +++++++++++++----- 19 files changed, 165 insertions(+), 109 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_003.phpt b/Zend/tests/type_declarations/typed_properties_003.phpt index c96a464680fa..3d7293fb41da 100644 --- a/Zend/tests/type_declarations/typed_properties_003.phpt +++ b/Zend/tests/type_declarations/typed_properties_003.phpt @@ -9,7 +9,7 @@ $thing = new class() { $var = &$thing->int; ?> --EXPECTF-- -Fatal error: Uncaught Error: Cannot access uninitialized non-nullable property by reference in %s:%d +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_033.phpt b/Zend/tests/type_declarations/typed_properties_033.phpt index a58c37fd22cb..153e0515be19 100644 --- a/Zend/tests/type_declarations/typed_properties_033.phpt +++ b/Zend/tests/type_declarations/typed_properties_033.phpt @@ -25,7 +25,7 @@ try { var_dump($foo); ?> --EXPECTF-- -Cannot assign float to reference held by property class@anonymous->qux of type int +Cannot assign float to reference held by property class@anonymous::$qux of type int object(class@anonymous)#1 (4) { ["foo"]=> int(2) diff --git a/Zend/tests/type_declarations/typed_properties_034.phpt b/Zend/tests/type_declarations/typed_properties_034.phpt index 9fd14d6ec27b..c3885af39f8d 100644 --- a/Zend/tests/type_declarations/typed_properties_034.phpt +++ b/Zend/tests/type_declarations/typed_properties_034.phpt @@ -42,7 +42,7 @@ 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 +Cannot assign null to reference held by property class@anonymous::$baz of type int object(class@anonymous)#1 (2) { ["bar"]=> &int(10) diff --git a/Zend/tests/type_declarations/typed_properties_037.phpt b/Zend/tests/type_declarations/typed_properties_037.phpt index ed0869af30aa..1d4862ef0a72 100644 --- a/Zend/tests/type_declarations/typed_properties_037.phpt +++ b/Zend/tests/type_declarations/typed_properties_037.phpt @@ -8,7 +8,7 @@ $foo = new class { var_dump($foo); --EXPECTF-- -object(class@anonymous)#%d (%d) { +object(class@anonymous)#%d (1) { ["bar"]=> int(10) ["qux"]=> diff --git a/Zend/tests/type_declarations/typed_properties_038.phpt b/Zend/tests/type_declarations/typed_properties_038.phpt index 49e0fa93af7e..af8b39cb6642 100644 --- a/Zend/tests/type_declarations/typed_properties_038.phpt +++ b/Zend/tests/type_declarations/typed_properties_038.phpt @@ -40,22 +40,22 @@ try { var_dump($foo); --EXPECTF-- string(60) "Typed property class@anonymous::$bar must be int, float used" -object(class@anonymous)#%d (%d) { +object(class@anonymous)#%d (1) { ["bar"]=> int(%d) } string(60) "Typed property class@anonymous::$bar must be int, float used" -object(class@anonymous)#%d (%d) { +object(class@anonymous)#%d (1) { ["bar"]=> int(%d) } string(60) "Typed property class@anonymous::$bar must be int, float used" -object(class@anonymous)#%d (%d) { +object(class@anonymous)#%d (1) { ["bar"]=> int(%d) } string(60) "Typed property class@anonymous::$bar must be int, float used" -object(class@anonymous)#%d (%d) { +object(class@anonymous)#%d (1) { ["bar"]=> int(%d) } diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt index f2632ef09e48..39e324edb64c 100644 --- a/Zend/tests/type_declarations/typed_properties_044.phpt +++ b/Zend/tests/type_declarations/typed_properties_044.phpt @@ -43,7 +43,7 @@ int(0) int(-2) int(-1) int(-1) -Cannot assign float to reference held by property class@anonymous->bar of type ?int -Cannot assign float to reference held by property class@anonymous->bar of type ?int +Cannot assign float to reference held by property class@anonymous::$bar of type ?int +Cannot assign float to reference held by property class@anonymous::$bar of type ?int int(-9223372036854775808) int(-9223372036854775808) diff --git a/Zend/tests/type_declarations/typed_properties_045.phpt b/Zend/tests/type_declarations/typed_properties_045.phpt index 96733563e637..3343ec8bb924 100644 --- a/Zend/tests/type_declarations/typed_properties_045.phpt +++ b/Zend/tests/type_declarations/typed_properties_045.phpt @@ -24,7 +24,7 @@ foreach ($foo = new Foo as $k => &$val) { --EXPECT-- int(0) int(20) -Cannot assign array to reference held by property Foo->bar of type int +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 +Cannot assign array to reference held by property Foo::$baz of type float diff --git a/Zend/tests/type_declarations/typed_properties_055.phpt b/Zend/tests/type_declarations/typed_properties_055.phpt index a648d97b63ae..31d687254c46 100644 --- a/Zend/tests/type_declarations/typed_properties_055.phpt +++ b/Zend/tests/type_declarations/typed_properties_055.phpt @@ -1,5 +1,5 @@ --TEST-- -Default values of callable properties +Test assign to typed property taken by reference --FILE-- a->bar); int(1) int(2) -Fatal error: Uncaught TypeError: Cannot assign string to reference held by property A->bar of type int in %s:%d +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} diff --git a/Zend/tests/type_declarations/typed_properties_062.phpt b/Zend/tests/type_declarations/typed_properties_062.phpt index f91e9ab758d7..adfc462f8dac 100644 --- a/Zend/tests/type_declarations/typed_properties_062.phpt +++ b/Zend/tests/type_declarations/typed_properties_062.phpt @@ -52,14 +52,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference held by property class@anonymous->foo of type int +Cannot assign string to reference held by property class@anonymous::$foo of type int int(21) int(20) int(19) -Cannot assign float to reference held by property class@anonymous->foo of type int +Cannot assign float to reference held by property class@anonymous::$foo of type int integer -Cannot assign float to reference held by property class@anonymous->foo of type int +Cannot assign float to reference held by property class@anonymous::$foo of type int integer -Cannot assign array to reference held by property class@anonymous->foo of type int +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 index 76567d2d7892..f5b4a16584fb 100644 --- a/Zend/tests/type_declarations/typed_properties_063.phpt +++ b/Zend/tests/type_declarations/typed_properties_063.phpt @@ -51,14 +51,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference held by property class@anonymous->foo of type int +Cannot assign string to reference held by property class@anonymous::$foo of type int int(21) int(20) int(19) -Cannot assign float to reference held by property class@anonymous->foo of type int +Cannot assign float to reference held by property class@anonymous::$foo of type int integer -Cannot assign float to reference held by property class@anonymous->foo of type int +Cannot assign float to reference held by property class@anonymous::$foo of type int integer -Cannot assign array to reference held by property class@anonymous->foo of type int +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 index ae1dbc6deb33..0e06fee88174 100644 --- a/Zend/tests/type_declarations/typed_properties_064.phpt +++ b/Zend/tests/type_declarations/typed_properties_064.phpt @@ -51,14 +51,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference held by property class@anonymous->foo of type int +Cannot assign string to reference held by property class@anonymous::$foo of type int int(21) int(20) int(19) -Cannot assign float to reference held by property class@anonymous->foo of type int +Cannot assign float to reference held by property class@anonymous::$foo of type int integer -Cannot assign float to reference held by property class@anonymous->foo of type int +Cannot assign float to reference held by property class@anonymous::$foo of type int integer -Cannot assign array to reference held by property class@anonymous->foo of type int +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 index 7e3c61bc638a..ea8ba8fd6752 100644 --- a/Zend/tests/type_declarations/typed_properties_065.phpt +++ b/Zend/tests/type_declarations/typed_properties_065.phpt @@ -49,7 +49,7 @@ offsetSet(1e50) int(1) int(0) int(-1) -Cannot assign float to reference held by property class@anonymous->foo of type int +Cannot assign float to reference held by property class@anonymous::$foo of type int integer -Cannot assign float to reference held by property class@anonymous->foo of type int +Cannot assign float to reference held by property class@anonymous::$foo of type int integer diff --git a/Zend/tests/type_declarations/typed_properties_068.phpt b/Zend/tests/type_declarations/typed_properties_068.phpt index 508e079a94fb..7ed58d2a0089 100644 --- a/Zend/tests/type_declarations/typed_properties_068.phpt +++ b/Zend/tests/type_declarations/typed_properties_068.phpt @@ -2,25 +2,10 @@ Test typed static property by ref --FILE-- getMessage()."\n"; } var_dump($i, Foo::$i); -Foo::$s = &intRef(); -var_dump(Foo::$s, intRef()); +Foo::$s = &ref(5); +var_dump(Foo::$s, ref()); -Foo::$i = &stringRef(); -var_dump(Foo::$i, stringRef()); +Foo::$i = &ref("0"); +var_dump(Foo::$i, ref()); try { - Foo::$i = &nonNumericStringRef(); + Foo::$i = &ref("x"); } catch (TypeError $e) { print $e->getMessage()."\n"; } -var_dump(Foo::$i, nonNumericStringRef()); +var_dump(Foo::$i, ref()); try { Foo::$i = &Foo::$s; @@ -88,9 +73,9 @@ Typed property Foo::$i must be int, null used int(4) int(4) string(1) "5" -int(5) +string(1) "5" +int(0) int(0) -string(1) "0" Typed property Foo::$i must be int, string used int(0) string(1) "x" diff --git a/Zend/tests/type_declarations/typed_properties_078.phpt b/Zend/tests/type_declarations/typed_properties_078.phpt index 52c1ffccbe55..6645970dd412 100644 --- a/Zend/tests/type_declarations/typed_properties_078.phpt +++ b/Zend/tests/type_declarations/typed_properties_078.phpt @@ -52,8 +52,8 @@ array(1) { [0]=> int(1) } -string(91) "Cannot assign ArrayIterator to reference held by property class@anonymous->a of type ?array" +string(92) "Cannot assign ArrayIterator to reference held by property class@anonymous::$a of type ?array" bool(false) -string(89) "Cannot assign array to reference held by property class@anonymous->t of type ?Traversable" +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_081.phpt b/Zend/tests/type_declarations/typed_properties_081.phpt index 23b1abf825d8..1198244e831e 100644 --- a/Zend/tests/type_declarations/typed_properties_081.phpt +++ b/Zend/tests/type_declarations/typed_properties_081.phpt @@ -18,6 +18,6 @@ var_dump($test2->x); ?> --EXPECT-- -Cannot assign string to reference held by property Test->x of type int +Cannot assign string to reference held by property Test::$x of type int int(42) diff --git a/Zend/tests/type_declarations/typed_properties_083.phpt b/Zend/tests/type_declarations/typed_properties_083.phpt index bcf304404486..b4f70287103c 100644 --- a/Zend/tests/type_declarations/typed_properties_083.phpt +++ b/Zend/tests/type_declarations/typed_properties_083.phpt @@ -54,19 +54,19 @@ array(1) { [0]=> int(1) } -string(71) "Cannot write an array to a null property which does not allow for array" +string(79) "Cannot write an array to a null property Foo::$p which does not allow for array" string(65) "Typed property Foo::$p must not be accessed before initialization" array(1) { ["bar"]=> int(2) } -string(71) "Cannot write an array to a null property which does not allow for array" +string(79) "Cannot write an array to a null property Foo::$s which does not allow for array" string(72) "Typed static property Foo::$s must not be accessed before initialization" array(1) { [0]=> int(3) } -string(81) "Cannot write an array to a null or false reference which does not allow for array" +string(97) "Cannot write an array to a null or false reference held by Foo::$p which does not allow for array" NULL -string(81) "Cannot write an array to a null or false reference which does not allow for array" +string(97) "Cannot write an array to a null or false reference held by Foo::$p which does not allow for array" NULL diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 4b5510eb11a8..5bb366448fdf 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2109,7 +2109,9 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * zend_property_info *error_prop; if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_container))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); } else { array_init(container); goto fetch_from_array; @@ -2456,14 +2458,18 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(ptr) <= IS_FALSE || (Z_ISREF_P(ptr) && Z_TYPE_P(Z_REFVAL_P(ptr)) == IS_NULL))) { if (!zend_verify_type_assignable(prop_info->type, IS_ARRAY)) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Cannot write an array to a null property which does not allow for array"); + "Cannot write an array to a null property %s::$%s which does not allow for array", + ZSTR_VAL(prop_info->ce->name), + ZSTR_VAL(prop_info->name)); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); } return; } if (!ZEND_TYPE_ALLOW_NULL(prop_info->type) && Z_TYPE_P(ptr) == IS_NULL) { - zend_throw_error(NULL, "Cannot access uninitialized non-nullable property by reference"); + zend_throw_error(NULL, "Cannot access uninitialized non-nullable property %s::$%s by reference", + ZSTR_VAL(prop_info->ce->name), + ZSTR_VAL(prop_info->name)); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); return; @@ -2626,13 +2632,17 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, && (Z_TYPE_P(*retval) <= IS_FALSE || (Z_ISREF_P(*retval) && Z_TYPE_P(Z_REFVAL_P(*retval)) == IS_NULL)) && !zend_verify_type_assignable(property_info->type, IS_ARRAY)) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), - "Cannot write an array to a null property which does not allow for array"); + "Cannot write an array to a null property %s::$%s which does not allow for array", + ZSTR_VAL(property_info->ce->name), + ZSTR_VAL(property_info->name)); return FAILURE; } if ((flags & ZEND_FETCH_REF) && Z_TYPE_P(*retval) != IS_REFERENCE) { zval *ref = *retval; if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(*retval) <= IS_NULL)) { - zend_throw_error(NULL, "Cannot access uninitialized property by reference"); + zend_throw_error(NULL, "Cannot access uninitialized property %s::$%s by reference", + ZSTR_VAL(property_info->ce->name), + ZSTR_VAL(property_info->name)); return FAILURE; } ZVAL_NEW_REF(ref, ref); @@ -2675,15 +2685,13 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1 zend_unmangle_property_name_ex(prop2->name, &class_name2, &prop_name2, NULL); zend_throw_exception_ex( zend_ce_type_error, 0, - "Reference with value of type %s held by property %s%s%s of type %s%s is not compatible with property %s%s%s of type %s%s", + "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), - (prop1->flags & ZEND_ACC_STATIC) ? "::$" : "->", prop_name1, ZEND_TYPE_ALLOW_NULL(prop1->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop1->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop1->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop1->type)), ZSTR_VAL(prop2->ce->name), - (prop2->flags & ZEND_ACC_STATIC) ? "::$" : "->", prop_name2, ZEND_TYPE_ALLOW_NULL(prop2->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop2->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop2->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop2->type)) @@ -2693,10 +2701,9 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1 ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zval *zv) { zend_throw_exception_ex( zend_ce_type_error, 0, - "Cannot assign %s to reference held by property %s%s%s of type %s%s", + "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), - (prop->flags & ZEND_ACC_STATIC) ? "::$" : "->", ZSTR_VAL(prop->name), ZEND_TYPE_ALLOW_NULL(prop->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop->type)) @@ -2707,15 +2714,13 @@ ZEND_API ZEND_COLD void zend_throw_conflicting_coercion_error( zend_property_info *prop1, zend_property_info *prop2, zval *zv) { zend_throw_exception_ex( zend_ce_type_error, 0, - "Cannot assign %s to reference held by property %s%s%s of type %s%s and property %s%s%s of type %s%s, as this would result in an inconsistent type conversion", + "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), - (prop1->flags & ZEND_ACC_STATIC) ? "::$" : "->", ZSTR_VAL(prop1->name), ZEND_TYPE_ALLOW_NULL(prop1->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop1->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop1->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop1->type)), ZSTR_VAL(prop2->ce->name), - (prop2->flags & ZEND_ACC_STATIC) ? "::$" : "->", ZSTR_VAL(prop2->name), ZEND_TYPE_ALLOW_NULL(prop2->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop2->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop2->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop2->type)) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7a086663ef26..0b14d4a09ef7 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2573,7 +2573,9 @@ ZEND_VM_C_LABEL(try_assign_dim_array): zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); FREE_UNFETCHED_OP2(); FREE_UNFETCHED_OP_DATA(); FREE_OP1_VAR_PTR(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index ef73f1630d1f..087c8013900b 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -26088,7 +26088,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26209,7 +26211,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26330,7 +26334,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26450,7 +26456,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29021,7 +29029,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29142,7 +29152,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29263,7 +29275,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29383,7 +29397,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31001,7 +31017,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31122,7 +31140,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31243,7 +31263,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31363,7 +31385,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33551,7 +33575,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33672,7 +33698,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33793,7 +33821,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33913,7 +33943,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -46405,7 +46437,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); @@ -46526,7 +46560,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46647,7 +46683,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46767,7 +46805,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); @@ -50735,7 +50775,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50856,7 +50898,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -50977,7 +51021,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -51097,7 +51143,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -54006,7 +54054,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); @@ -54127,7 +54177,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -54248,7 +54300,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -54368,7 +54422,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); @@ -57624,7 +57680,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); @@ -57745,7 +57803,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -57866,7 +57926,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -57986,7 +58048,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); From f697a7b243a04c979845d3174851afa552158e91 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 24 Sep 2018 22:20:15 +0200 Subject: [PATCH 314/369] Fix two more tests in ext/standard --- ext/standard/tests/array/extract_typed_ref.phpt | 2 +- .../tests/general_functions/settype_typed_property.phpt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/standard/tests/array/extract_typed_ref.phpt b/ext/standard/tests/array/extract_typed_ref.phpt index 8eac12945f48..8b697d5ccb24 100644 --- a/ext/standard/tests/array/extract_typed_ref.phpt +++ b/ext/standard/tests/array/extract_typed_ref.phpt @@ -18,6 +18,6 @@ var_dump($test->i, $test->s); ?> --EXPECT-- -Cannot assign string to reference held by property Test->i of type int +Cannot assign string to reference held by property Test::$i of type int int(0) string(0) "" diff --git a/ext/standard/tests/general_functions/settype_typed_property.phpt b/ext/standard/tests/general_functions/settype_typed_property.phpt index a987a4167077..a206a4ba41b2 100644 --- a/ext/standard/tests/general_functions/settype_typed_property.phpt +++ b/ext/standard/tests/general_functions/settype_typed_property.phpt @@ -24,5 +24,5 @@ var_dump($test->x); ?> --EXPECT-- int(42) -Cannot assign array to reference held by property Test->x of type int +Cannot assign array to reference held by property Test::$x of type int int(42) From f2d72b92850f7b7f2931731403a52778a0bc1b0b Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Tue, 25 Sep 2018 12:09:56 +0200 Subject: [PATCH 315/369] Evaluate expressions involving constants in property initializers according to strict_types of the class containing file This ensures consistency with function default values, while not introducing a disparity between compile and run-time evaluation of initializers (i.e. preventing ordering dependent outcomes). --- .../typed_properties_043.phpt | 33 +++++++++++++++++++ .../typed_properties_058.phpt | 4 ++- Zend/zend_API.c | 3 +- Zend/zend_compile.c | 2 +- Zend/zend_compile.h | 9 ++--- 5 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_043.phpt 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 000000000000..9593d588644d --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_043.phpt @@ -0,0 +1,33 @@ +--TEST-- +Constants in default values of properties with weak types +--FILE-- +foo, $o->float); + +for ($i = 0; $i < 2; $i++) { + try { + $o = new B(); + var_dump($o->foo); + } catch (Throwable $e) { + echo $e->getMessage() . "\n"; + } +} +?> +--EXPECT-- +string(7) "5.0E+20" +float(5.0E+20) +Typed property B::$foo must be int, float used +Typed property B::$foo must be int, float used diff --git a/Zend/tests/type_declarations/typed_properties_058.phpt b/Zend/tests/type_declarations/typed_properties_058.phpt index 09a21435c4f0..f202b1aeeca3 100644 --- a/Zend/tests/type_declarations/typed_properties_058.phpt +++ b/Zend/tests/type_declarations/typed_properties_058.phpt @@ -8,6 +8,7 @@ define("FOO", 5); class A { public int $foo = FOO; + public float $float = FOO; } class B { @@ -15,7 +16,7 @@ class B { } $o = new A(); -var_dump($o->foo); +var_dump($o->foo, $o->float); for ($i = 0; $i < 2; $i++) { try { @@ -28,6 +29,7 @@ for ($i = 0; $i < 2; $i++) { ?> --EXPECT-- int(5) +float(5) Typed property B::$foo must be string, int used Typed property B::$foo must be string, int used diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 8c896b8905ca..8bd9630c9bbe 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1180,9 +1180,8 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */ if (UNEXPECTED(zval_update_constant_ex(&tmp, ce) != SUCCESS)) { return FAILURE; } - if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, (ce->ce_flags & ZEND_ACC_STRICT_TYPES) != 0))) { zend_verify_property_type_error(prop_info, &tmp); - class_type->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; zval_ptr_dtor(&tmp); return FAILURE; } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 9471a5aae83a..d00274b65cdd 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6386,7 +6386,7 @@ void zend_compile_class_decl(zend_ast *ast, zend_bool toplevel) /* {{{ */ ce->name = name; zend_initialize_class_data(ce, 1); - ce->ce_flags |= decl->flags; + ce->ce_flags |= decl->flags | (CG(active_op_array)->fn_flags & ZEND_ACC_STRICT_TYPES); ce->info.user.filename = zend_get_compiled_filename(); ce->info.user.line_start = decl->start_lineno; ce->info.user.line_end = decl->end_lineno; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index f21257a6ece6..1409ad11eecc 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -220,7 +220,11 @@ typedef struct _zend_oparray_context { /* Function has typed arguments / class has typed props | | | */ #define ZEND_ACC_HAS_TYPE_HINTS (1 << 7) /* X | X | | */ /* | | | */ -/* Class Flags (unused: 14...) | | | */ +/* op_array uses strict mode types | | | */ +/* | | | */ +#define ZEND_ACC_STRICT_TYPES (1 << 31) /* X | X | | */ +/* | | | */ +/* Class Flags (unused: 14..30) | | | */ /* =========== | | | */ /* | | | */ /* Special class types | | | */ @@ -304,9 +308,6 @@ typedef struct _zend_oparray_context { /* | | | */ /* internal function is allocated at arena (int only) | | | */ #define ZEND_ACC_ARENA_ALLOCATED (1 << 24) /* | X | | */ -/* | | | */ -/* op_array uses strict mode types | | | */ -#define ZEND_ACC_STRICT_TYPES (1 << 31) /* | X | | */ #define ZEND_ACC_PPP_MASK (ZEND_ACC_PUBLIC | ZEND_ACC_PROTECTED | ZEND_ACC_PRIVATE) From c78d5f6d1ec7cf8f382bcfa5b0a91a884bd2c457 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Tue, 25 Sep 2018 13:28:57 +0200 Subject: [PATCH 316/369] Make visibility a property of the prop_group AST node --- Zend/zend_ast.c | 3 +-- Zend/zend_compile.c | 5 ++--- Zend/zend_language_parser.y | 4 ++-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 16f5b46dc12b..d71aa3daa54c 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -1419,8 +1419,6 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio zend_ast *type_ast = ast->child[0]; zend_ast *prop_ast = ast->child[1]; - ast = prop_ast; - if (ast->attr & ZEND_ACC_PUBLIC) { smart_str_appends(str, "public "); } else if (ast->attr & ZEND_ACC_PROTECTED) { @@ -1441,6 +1439,7 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio smart_str_appendc(str, ' '); } + ast = prop_ast; goto simple_list; } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index d00274b65cdd..af1e01e4763d 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6007,10 +6007,9 @@ void zend_compile_func_decl(znode *result, zend_ast *ast, zend_bool toplevel) /* } /* }}} */ -void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_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; @@ -6143,7 +6142,7 @@ 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); + zend_compile_prop_decl(prop_ast, type_ast, list->attr); } /* }}} */ void zend_compile_class_const_decl(zend_ast *ast) /* {{{ */ diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index f78f3011afc8..7ec0ca112605 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -717,8 +717,8 @@ class_statement_list: class_statement: variable_modifiers optional_type property_list ';' - { $3->attr = $1; - $$ = zend_ast_create(ZEND_AST_PROP_GROUP, $2, $3); } + { $$ = 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 From ce68539840f133094b56e468f7a0b1ce55a446fd Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Tue, 25 Sep 2018 13:34:15 +0200 Subject: [PATCH 317/369] Enforce strict types for property initializer evaluation Revert "Evaluate expressions involving constants in property initializers according to strict_types of the class containing file" This reverts commit f2d72b92850f7b7f2931731403a52778a0bc1b0b. --- .../typed_properties_043.phpt | 33 ------------------- .../typed_properties_058.phpt | 4 +-- Zend/zend_API.c | 2 +- Zend/zend_compile.c | 2 +- Zend/zend_compile.h | 9 +++-- 5 files changed, 7 insertions(+), 43 deletions(-) delete mode 100644 Zend/tests/type_declarations/typed_properties_043.phpt diff --git a/Zend/tests/type_declarations/typed_properties_043.phpt b/Zend/tests/type_declarations/typed_properties_043.phpt deleted file mode 100644 index 9593d588644d..000000000000 --- a/Zend/tests/type_declarations/typed_properties_043.phpt +++ /dev/null @@ -1,33 +0,0 @@ ---TEST-- -Constants in default values of properties with weak types ---FILE-- -foo, $o->float); - -for ($i = 0; $i < 2; $i++) { - try { - $o = new B(); - var_dump($o->foo); - } catch (Throwable $e) { - echo $e->getMessage() . "\n"; - } -} -?> ---EXPECT-- -string(7) "5.0E+20" -float(5.0E+20) -Typed property B::$foo must be int, float used -Typed property B::$foo must be int, float used diff --git a/Zend/tests/type_declarations/typed_properties_058.phpt b/Zend/tests/type_declarations/typed_properties_058.phpt index f202b1aeeca3..09a21435c4f0 100644 --- a/Zend/tests/type_declarations/typed_properties_058.phpt +++ b/Zend/tests/type_declarations/typed_properties_058.phpt @@ -8,7 +8,6 @@ define("FOO", 5); class A { public int $foo = FOO; - public float $float = FOO; } class B { @@ -16,7 +15,7 @@ class B { } $o = new A(); -var_dump($o->foo, $o->float); +var_dump($o->foo); for ($i = 0; $i < 2; $i++) { try { @@ -29,7 +28,6 @@ for ($i = 0; $i < 2; $i++) { ?> --EXPECT-- int(5) -float(5) Typed property B::$foo must be string, int used Typed property B::$foo must be string, int used diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 8bd9630c9bbe..b3f97bf94a9e 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1180,7 +1180,7 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */ if (UNEXPECTED(zval_update_constant_ex(&tmp, ce) != SUCCESS)) { return FAILURE; } - if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, (ce->ce_flags & ZEND_ACC_STRICT_TYPES) != 0))) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, 1 /* property initializers must always be evaluated with strict types */))) { zend_verify_property_type_error(prop_info, &tmp); zval_ptr_dtor(&tmp); return FAILURE; diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index af1e01e4763d..47ca355495ca 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6385,7 +6385,7 @@ void zend_compile_class_decl(zend_ast *ast, zend_bool toplevel) /* {{{ */ ce->name = name; zend_initialize_class_data(ce, 1); - ce->ce_flags |= decl->flags | (CG(active_op_array)->fn_flags & ZEND_ACC_STRICT_TYPES); + ce->ce_flags |= decl->flags; ce->info.user.filename = zend_get_compiled_filename(); ce->info.user.line_start = decl->start_lineno; ce->info.user.line_end = decl->end_lineno; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 1409ad11eecc..f21257a6ece6 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -220,11 +220,7 @@ typedef struct _zend_oparray_context { /* Function has typed arguments / class has typed props | | | */ #define ZEND_ACC_HAS_TYPE_HINTS (1 << 7) /* X | X | | */ /* | | | */ -/* op_array uses strict mode types | | | */ -/* | | | */ -#define ZEND_ACC_STRICT_TYPES (1 << 31) /* X | X | | */ -/* | | | */ -/* Class Flags (unused: 14..30) | | | */ +/* Class Flags (unused: 14...) | | | */ /* =========== | | | */ /* | | | */ /* Special class types | | | */ @@ -308,6 +304,9 @@ typedef struct _zend_oparray_context { /* | | | */ /* internal function is allocated at arena (int only) | | | */ #define ZEND_ACC_ARENA_ALLOCATED (1 << 24) /* | X | | */ +/* | | | */ +/* op_array uses strict mode types | | | */ +#define ZEND_ACC_STRICT_TYPES (1 << 31) /* | X | | */ #define ZEND_ACC_PPP_MASK (ZEND_ACC_PUBLIC | ZEND_ACC_PROTECTED | ZEND_ACC_PRIVATE) From 68abea69dcf6d857a4096bf3cec2e2f82e29e84c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 27 Sep 2018 11:14:23 +0200 Subject: [PATCH 318/369] Remove REF flag from ASSIGN_(OBJ|STATIC_PROP)_REF This flag is not used and clashes with RETURNS_FUNCTION. --- Zend/zend_compile.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 47ca355495ca..bd62d79a2d08 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3000,12 +3000,14 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ if (opline && opline->opcode == ZEND_FETCH_OBJ_W) { opline->opcode = ZEND_ASSIGN_OBJ_REF; + opline->extended_value &= ~ZEND_FETCH_REF; zend_emit_op_data(&source_node); if (result != NULL) { *result = target_node; } } else if (opline && opline->opcode == ZEND_FETCH_STATIC_PROP_W) { opline->opcode = ZEND_ASSIGN_STATIC_PROP_REF; + opline->extended_value &= ~ZEND_FETCH_REF; zend_emit_op_data(&source_node); if (result != NULL) { *result = target_node; From e1508f2a75de124287331309111d31a10b176774 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 27 Sep 2018 12:25:06 +0200 Subject: [PATCH 319/369] Add a missing ASSIGN_STATIC_PROP_REF case --- ext/opcache/Optimizer/zend_optimizer.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 8779565432f8..b25c4bca9974 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -335,6 +335,7 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, break; } case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_STATIC_PROP_REF: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: From fe4f9f377ae6999d370adfab25037767d5f77806 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 27 Sep 2018 16:06:17 +0200 Subject: [PATCH 320/369] Don't return pointer to stack memory Normalize to variable_ptr rather than value to make lifetime requirement more obvious. We can't return "value" directly if it had to be coerced. --- Zend/zend_object_handlers.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 35814601a3dd..4259ceebbf1d 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -807,7 +807,7 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { zend_verify_property_type_error(prop_info, value); Z_TRY_DELREF_P(value); - value = &EG(error_zval); + variable_ptr = &EG(error_zval); goto exit; } value = &tmp; @@ -831,7 +831,7 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, } } } else if (UNEXPECTED(EG(exception))) { - value = &EG(error_zval); + variable_ptr = &EG(error_zval); goto exit; } @@ -845,13 +845,14 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, zend_std_call_setter(zobj, name, value); (*guard) &= ~IN_SET; OBJ_RELEASE(zobj); + variable_ptr = value; } else if (EXPECTED(!IS_WRONG_PROPERTY_OFFSET(property_offset))) { goto write_std_property; } else { /* Trigger the correct error */ zend_get_property_offset(zobj->ce, name, 0, NULL); ZEND_ASSERT(EG(exception)); - value = &EG(error_zval); + variable_ptr = &EG(error_zval); goto exit; } } else { @@ -881,18 +882,19 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, } value = &tmp; } - ZVAL_COPY_VALUE(OBJ_PROP(zobj, property_offset), value); + variable_ptr = OBJ_PROP(zobj, property_offset); + 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 value; + return variable_ptr; } /* }}} */ From ccf448193f5b93b0a891e79a29baa6f43990533e Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 27 Sep 2018 16:10:35 +0200 Subject: [PATCH 321/369] Initialize return value for one exception case --- Zend/zend_execute.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 476e6bb6babb..40d892e2f4c6 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2114,6 +2114,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); + ZVAL_ERROR(result); } else { array_init(container); goto fetch_from_array; From 313590d91462e859f3c7ee183d366fda8d5bb4cd Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 28 Sep 2018 22:48:29 +0200 Subject: [PATCH 322/369] Correctly handle resolved types in reflection --- ext/reflection/php_reflection.c | 4 +++- ext/reflection/tests/ReflectionType_001.phpt | 9 +++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 8bca4cf24315..5c0d4c206d9a 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -2875,8 +2875,10 @@ ZEND_METHOD(reflection_type, isBuiltin) /* {{{ reflection_type_name */ static zend_string *reflection_type_name(type_reference *param) { - if (ZEND_TYPE_IS_CLASS(param->type)) { + if (ZEND_TYPE_IS_NAME(param->type)) { return zend_string_copy(ZEND_TYPE_NAME(param->type)); + } else if (ZEND_TYPE_IS_CE(param->type)) { + return zend_string_copy(ZEND_TYPE_CE(param->type)->name); } else { char *name = zend_get_type_by_const(ZEND_TYPE_CODE(param->type)); return zend_string_init(name, strlen(name), 0); diff --git a/ext/reflection/tests/ReflectionType_001.phpt b/ext/reflection/tests/ReflectionType_001.phpt index bdffb19a9294..e47a9615ba56 100644 --- a/ext/reflection/tests/ReflectionType_001.phpt +++ b/ext/reflection/tests/ReflectionType_001.phpt @@ -95,7 +95,11 @@ foreach ($reflector->getProperties() as $name => $property) { } else printf("public $%s;\n", $property->getName()); } -echo "** property types\n"; +echo "*** resolved property types\n"; +$obj = new PropTypeTest; +$obj->std = new stdClass; +$r = (new ReflectionProperty($obj, 'std'))->getType(); +var_dump($r->getName()); ?> --EXPECT-- *** functions @@ -216,4 +220,5 @@ public iterable $iterable; public stdClass $std; public OtherThing $other; public $mixed; -** property types +*** resolved property types +string(8) "stdClass" From 98b8e8ea4c058323bc834c1e7672dd31ad156527 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 28 Sep 2018 22:50:52 +0200 Subject: [PATCH 323/369] Remove unused enum --- ext/reflection/php_reflection.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 5c0d4c206d9a..8e5cc1555ed5 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -117,11 +117,6 @@ typedef struct _parameter_reference { zend_function *fptr; } parameter_reference; -typedef enum { - REF_INFO_ARG, - REF_INFO_PROP -} reflection_info_type_t; - /* Struct for type hints */ typedef struct _type_reference { zend_type type; From 6f9eac9c0ccc64ec6f3e2e4535c0546327220852 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 28 Sep 2018 22:53:10 +0200 Subject: [PATCH 324/369] Only lookup prop info for INDIRECT --- ext/standard/var.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/ext/standard/var.c b/ext/standard/var.c index c94b741a41e4..e5ccec48e25f 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -175,10 +175,9 @@ PHPAPI void php_var_dump(zval *struc, int level) /* {{{ */ if (Z_TYPE_P(val) == IS_INDIRECT) { val = Z_INDIRECT_P(val); - } - - if (key) { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(struc), key, NULL); + if (key) { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(struc), key, NULL); + } } if (!Z_ISUNDEF_P(val) || prop_info) { @@ -367,10 +366,9 @@ PHPAPI void php_debug_zval_dump(zval *struc, int level) /* {{{ */ if (Z_TYPE_P(val) == IS_INDIRECT) { val = Z_INDIRECT_P(val); - } - - if (key) { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(struc), key, NULL); + if (key) { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(struc), key, NULL); + } } if (!Z_ISUNDEF_P(val) || prop_info) { From b8881f0f509232629b826cc4f3133b0764154519 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 29 Sep 2018 13:51:24 +0200 Subject: [PATCH 325/369] Fix usage of self typehint in static trait properties --- .../typed_properties_043.phpt | 28 +++++++++++++++++++ Zend/zend_execute.c | 5 ++++ 2 files changed, 33 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_043.phpt 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 000000000000..992feba02563 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_043.phpt @@ -0,0 +1,28 @@ +--TEST-- +Trying to assign to a static 'self' typed property on a trait must not fixate the type to the trait +--FILE-- +getMessage(), "\n"; +} + +class Foo { + use Test; +} + +Foo::$prop = new Foo; + +var_dump(Foo::$prop); + +?> +--EXPECT-- +Cannot write a value to a 'self' typed static property of a trait +object(Foo)#1 (0) { +} diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 40d892e2f4c6..9a5057e4b4a0 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -909,6 +909,11 @@ ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_i ZEND_API zend_bool zend_load_property_class_type(zend_property_info *info) { if (zend_string_equals_literal_ci(ZEND_TYPE_NAME(info->type), "self")) { + if (UNEXPECTED((info->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(info->type) ? " non-null" : ""); + return 0; + } + zend_string_release(ZEND_TYPE_NAME(info->type)); info->type = ZEND_TYPE_ENCODE_CE(info->ce, ZEND_TYPE_ALLOW_NULL(info->type)); } else if (zend_string_equals_literal_ci(ZEND_TYPE_NAME(info->type), "parent")) { From de9a77f4ef344f0e3382e7d05282948ef97a3c2b Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 29 Sep 2018 14:58:44 +0200 Subject: [PATCH 326/369] Fix typed unint static property taken by ref being undefined --- .../type_declarations/typed_properties_087.phpt | 15 +++++++++++++++ Zend/zend_execute.c | 5 ++++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_087.phpt 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 000000000000..b981dfc166ba --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_087.phpt @@ -0,0 +1,15 @@ +--TEST-- +Ensure null-initialization of nullable typed static property taken by reference +--FILE-- + +--EXPECT-- +NULL diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9a5057e4b4a0..a27a0fd5b799 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2647,12 +2647,15 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } if ((flags & ZEND_FETCH_REF) && Z_TYPE_P(*retval) != IS_REFERENCE) { zval *ref = *retval; - if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(*retval) <= IS_NULL)) { + if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(ref) <= IS_NULL)) { zend_throw_error(NULL, "Cannot access uninitialized property %s::$%s by reference", ZSTR_VAL(property_info->ce->name), ZSTR_VAL(property_info->name)); return FAILURE; } + if (UNEXPECTED(Z_ISUNDEF_P(ref))) { + ZVAL_NULL(ref); + } ZVAL_NEW_REF(ref, ref); if (property_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ref), property_info); From 4ca499689bd4656e351d1766f666b3b57a538e3c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 29 Sep 2018 16:18:52 +0200 Subject: [PATCH 327/369] Fix reflection after recent master changes --- ext/reflection/php_reflection.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 9a12ca98084d..c7e23aefc523 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -5550,7 +5550,7 @@ ZEND_METHOD(reflection_property, isInitialized) } if (ref->prop.flags & ZEND_ACC_STATIC) { - member_p = zend_read_static_property_ex(ref->ce, ref->unmangled_name, 1); + member_p = zend_read_static_property_ex(intern->ce, ref->unmangled_name, 1); if (member_p) { RETURN_BOOL(!Z_ISUNDEF_P(member_p)) } @@ -5567,7 +5567,7 @@ ZEND_METHOD(reflection_property, isInitialized) /* Returns from this function */ } - member_p = zend_read_property_ex(ref->ce, object, ref->unmangled_name, 1, &rv); + member_p = zend_read_property_ex(intern->ce, object, ref->unmangled_name, 1, &rv); RETVAL_BOOL(member_p != &EG(uninitialized_zval)); if (member_p == &rv) { zval_ptr_dtor(member_p); From 23b1d0a7c4f0b95e56a8331970051c9f9bc26552 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 30 Sep 2018 18:52:43 +0200 Subject: [PATCH 328/369] Simplify code using compile_typename --- Zend/zend_compile.c | 35 +---------------------------------- 1 file changed, 1 insertion(+), 34 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 5e8ae9d2852d..887ec865d78d 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6023,43 +6023,10 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast, uint32_t flags) / zend_string *name = zval_make_interned_string(zend_ast_get_zval(name_ast)); zend_string *doc_comment = NULL; zval value_zv; - zend_bool allow_null = 0; zend_type type = 0; if (type_ast) { - if (type_ast->attr & ZEND_TYPE_NULLABLE) { - allow_null = 1; - type_ast->attr &= ~ZEND_TYPE_NULLABLE; - } - - if (type_ast->kind == ZEND_AST_TYPE) { - type = ZEND_TYPE_ENCODE(type_ast->attr, allow_null); - } else { - zend_string *class_name = zend_ast_get_str(type_ast); - zend_uchar typeinfo = zend_lookup_builtin_type_by_name(class_name); - - if (typeinfo != 0) { - if (type_ast->attr != ZEND_NAME_NOT_FQ) { - zend_error_noreturn(E_COMPILE_ERROR, - "Scalar type declaration '%s' must be unqualified", - ZSTR_VAL(zend_string_tolower(class_name))); - } - - type = ZEND_TYPE_ENCODE(typeinfo, allow_null); - } else { - uint32_t fetch_type = zend_get_class_fetch_type_ast(type_ast); - - if (fetch_type == ZEND_FETCH_CLASS_DEFAULT) { - class_name = zend_resolve_class_name_ast(type_ast); - zend_assert_valid_class_name(class_name); - } else { - zend_ensure_valid_class_fetch_type(fetch_type); - zend_string_addref(class_name); - } - - type = ZEND_TYPE_ENCODE_CLASS(zend_new_interned_string(class_name), allow_null); - } - } + 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, From f1e09b3db2314ebed2ebfc3683bb8fa00d55f972 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 30 Sep 2018 18:54:42 +0200 Subject: [PATCH 329/369] Fix tests for master changes --- .../tests/type_declarations/typed_properties_021.phpt | 11 ++++------- .../tests/type_declarations/typed_properties_022.phpt | 11 ++++------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_021.phpt b/Zend/tests/type_declarations/typed_properties_021.phpt index 79a5d70098e4..a9f82528d926 100644 --- a/Zend/tests/type_declarations/typed_properties_021.phpt +++ b/Zend/tests/type_declarations/typed_properties_021.phpt @@ -9,10 +9,7 @@ class Foo { $foo = new Foo(); ?> --EXPECTF-- -Fatal error: Class 'BAR' not found in %s on line 6 - - - - - - +Fatal error: Uncaught Error: Class 'BAR' not found in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_022.phpt b/Zend/tests/type_declarations/typed_properties_022.phpt index 1aa23f301fdf..7e947825c954 100644 --- a/Zend/tests/type_declarations/typed_properties_022.phpt +++ b/Zend/tests/type_declarations/typed_properties_022.phpt @@ -9,10 +9,7 @@ class Foo { $foo = new Foo(); ?> --EXPECTF-- -Fatal error: Class 'BAR' not found in %s on line 6 - - - - - - +Fatal error: Uncaught Error: Class 'BAR' not found in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d From 02f3baa3d1faf2e15fa5207d3a1e132614c05e6a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 30 Sep 2018 19:41:14 +0200 Subject: [PATCH 330/369] Fix cache slot invalidation --- .../typed_properties_088.phpt | 30 +++++++++++++++++++ Zend/zend_object_handlers.c | 4 +-- 2 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_088.phpt 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 000000000000..b2f626d3dab8 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_088.phpt @@ -0,0 +1,30 @@ +--TEST-- +Check for correct invalidation of prop_info cache slots +--FILE-- +prop = "42"; + var_dump($obj); +} + +test(new A); +test(new B); + +?> +--EXPECT-- +object(A)#1 (1) { + ["prop"]=> + int(42) +} +object(B)#1 (1) { + ["prop"]=> + string(2) "42" +} diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 4259ceebbf1d..780111ad12ef 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -453,9 +453,7 @@ static zend_always_inline uintptr_t zend_get_property_offset(zend_class_entry *c } if (cache_slot) { CACHE_POLYMORPHIC_PTR_EX(cache_slot, ce, (void*)(uintptr_t)property_info->offset); - if (property_info->type) { - CACHE_PTR_EX(cache_slot + 2, property_info); - } + CACHE_PTR_EX(cache_slot + 2, property_info->type ? property_info : NULL); } return property_info->offset; } From c38032a60ccdeb67a88e1dadf04650241b3b3e22 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 30 Sep 2018 20:19:49 +0200 Subject: [PATCH 331/369] Prevent any incdec on integer boundaries with typed properties --- .../typed_properties_033.phpt | 2 +- .../typed_properties_044.phpt | 23 +++-- .../typed_properties_062.phpt | 20 ++++- .../typed_properties_063.phpt | 20 ++++- .../typed_properties_064.phpt | 20 ++++- .../typed_properties_065.phpt | 21 ++++- Zend/zend_execute.c | 61 ++++++++++++- Zend/zend_vm_def.h | 28 +++++- Zend/zend_vm_execute.h | 88 ++++++++++++++++--- 9 files changed, 249 insertions(+), 34 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_033.phpt b/Zend/tests/type_declarations/typed_properties_033.phpt index 153e0515be19..87e6aef26b6e 100644 --- a/Zend/tests/type_declarations/typed_properties_033.phpt +++ b/Zend/tests/type_declarations/typed_properties_033.phpt @@ -18,7 +18,7 @@ $foo = new class { try { foreach ($foo->fetch() as &$prop) { - $prop++; + $prop += 1; } } catch (Error $e) { echo $e->getMessage(), "\n"; } diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt index 39e324edb64c..02a71a7b0b6b 100644 --- a/Zend/tests/type_declarations/typed_properties_044.phpt +++ b/Zend/tests/type_declarations/typed_properties_044.phpt @@ -31,11 +31,20 @@ try { echo $e->getMessage() . "\n"; } -/* (1 << 63) - 1 overflows to float, which is exactly convertible back to (1 << 63) */ $bar = PHP_INT_MIN; -var_dump($bar--); -var_dump(--$bar); + +try { + var_dump($bar--); +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; +} + +try { + var_dump(--$bar); +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; +} ?> --EXPECT-- @@ -43,7 +52,7 @@ int(0) int(-2) int(-1) int(-1) -Cannot assign float to reference held by property class@anonymous::$bar of type ?int -Cannot assign float to reference held by property class@anonymous::$bar of type ?int -int(-9223372036854775808) -int(-9223372036854775808) +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_062.phpt b/Zend/tests/type_declarations/typed_properties_062.phpt index adfc462f8dac..45f4682806f3 100644 --- a/Zend/tests/type_declarations/typed_properties_062.phpt +++ b/Zend/tests/type_declarations/typed_properties_062.phpt @@ -27,6 +27,18 @@ 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 { @@ -56,9 +68,13 @@ Cannot assign string to reference held by property class@anonymous::$foo of type int(21) int(20) int(19) -Cannot assign float to reference held by property class@anonymous::$foo of type int +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 assign float to reference held by property class@anonymous::$foo of type int +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) diff --git a/Zend/tests/type_declarations/typed_properties_063.phpt b/Zend/tests/type_declarations/typed_properties_063.phpt index f5b4a16584fb..bd4cccff22f3 100644 --- a/Zend/tests/type_declarations/typed_properties_063.phpt +++ b/Zend/tests/type_declarations/typed_properties_063.phpt @@ -26,6 +26,18 @@ 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 { @@ -55,9 +67,13 @@ Cannot assign string to reference held by property class@anonymous::$foo of type int(21) int(20) int(19) -Cannot assign float to reference held by property class@anonymous::$foo of type int +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 assign float to reference held by property class@anonymous::$foo of type int +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) diff --git a/Zend/tests/type_declarations/typed_properties_064.phpt b/Zend/tests/type_declarations/typed_properties_064.phpt index 0e06fee88174..59e0552898a8 100644 --- a/Zend/tests/type_declarations/typed_properties_064.phpt +++ b/Zend/tests/type_declarations/typed_properties_064.phpt @@ -26,6 +26,18 @@ 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 { @@ -55,9 +67,13 @@ Cannot assign string to reference held by property class@anonymous::$foo of type int(21) int(20) int(19) -Cannot assign float to reference held by property class@anonymous::$foo of type int +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 assign float to reference held by property class@anonymous::$foo of type int +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) diff --git a/Zend/tests/type_declarations/typed_properties_065.phpt b/Zend/tests/type_declarations/typed_properties_065.phpt index ea8ba8fd6752..0eac6a488baf 100644 --- a/Zend/tests/type_declarations/typed_properties_065.phpt +++ b/Zend/tests/type_declarations/typed_properties_065.phpt @@ -27,6 +27,18 @@ 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 { @@ -49,7 +61,12 @@ offsetSet(1e50) int(1) int(0) int(-1) -Cannot assign float to reference held by property class@anonymous::$foo of type int +Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value integer -Cannot assign float to reference held by property class@anonymous::$foo of type int +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/zend_execute.c b/Zend/zend_execute.c index a27a0fd5b799..019505e1097e 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1532,6 +1532,33 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, } } +static zend_property_info *zend_ref_accepts_double(zend_reference *ref) +{ + zend_property_info *prop; + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (ZEND_TYPE_CODE(prop->type) != IS_DOUBLE) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + return NULL; +} + +static ZEND_COLD zend_bool zend_ref_verify_assign_incdec_double(zend_reference *ref, int inc) +{ + zend_property_info *error_prop; + if ((error_prop = zend_ref_accepts_double(ref))) { + zend_throw_exception_ex(zend_ce_type_error, 0, + "Cannot %screment a reference held by property %s::$%s of type %sint past its %simal value", + inc ? "in" : "de", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name), + ZEND_TYPE_ALLOW_NULL(error_prop->type) ? "?" : "", + inc ? "max" : "min"); + return 0; + } + return 1; +} + static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_info, int inc OPLINE_DC EXECUTE_DATA_DC) { if (EXPECTED(Z_TYPE_P(prop) == IS_LONG)) { @@ -1567,7 +1594,22 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i } else { decrement_function(&z_copy); } - if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE(z_copy) == IS_DOUBLE) && Z_TYPE_P(prop) == IS_LONG) { + if (ref) { + if (zend_ref_verify_assign_incdec_double(ref, inc)) { + ZVAL_COPY_VALUE(&ref->val, &z_copy); + } + } else { + ZEND_ASSERT(ZEND_TYPE_CODE(prop_info->type) == IS_LONG); + zend_throw_exception_ex(zend_ce_type_error, 0, + "Cannot %screment a property %s::$%s of type %sint past its %simal value", + inc ? "in" : "de", + ZSTR_VAL(prop_info->ce->name), + ZSTR_VAL(prop_info->name), + ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", + inc ? "max" : "min"); + } + } else if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -1630,7 +1672,22 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ } else { decrement_function(&z_copy); } - if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE(z_copy) == IS_DOUBLE) && Z_TYPE_P(prop) == IS_LONG) { + if (ref) { + if (zend_ref_verify_assign_incdec_double(ref, inc)) { + ZVAL_COPY_VALUE(&ref->val, &z_copy); + } + } else { + ZEND_ASSERT(ZEND_TYPE_CODE(prop_info->type) == IS_LONG); + zend_throw_exception_ex(zend_ce_type_error, 0, + "Cannot %screment a property %s::$%s of type %sint past its %simal value", + inc ? "in" : "de", + ZSTR_VAL(prop_info->ce->name), + ZSTR_VAL(prop_info->name), + ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", + inc ? "max" : "min"); + } + } else if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 0b14d4a09ef7..51341c417e91 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1430,7 +1430,13 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 1)) { + ZVAL_COPY_VALUE(var_ptr, &old); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); FREE_OP1_VAR_PTR(); @@ -1492,7 +1498,13 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 0)) { + ZVAL_COPY_VALUE(var_ptr, &old); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); FREE_OP1_VAR_PTR(); @@ -1547,7 +1559,11 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 1)) { + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -1593,7 +1609,11 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 0)) { + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 087c8013900b..a1f1a5559e17 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -22765,7 +22765,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 1)) { + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22826,7 +22832,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 1)) { + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22888,7 +22900,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 0)) { + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22950,7 +22968,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 0)) { + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -23005,7 +23029,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 1)) { + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -23051,7 +23079,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 0)) { + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -41826,7 +41858,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 1)) { + ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); @@ -41886,7 +41924,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 1)) { + ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); @@ -41947,7 +41991,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 0)) { + ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); @@ -42008,7 +42058,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 0)) { + ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); @@ -42062,7 +42118,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 1)) { + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -42107,7 +42167,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 0)) { + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } From 1d555b709ebce9529f1f5919b0031734a8da8aee Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 30 Sep 2018 22:26:42 +0200 Subject: [PATCH 332/369] Fix leak when modifying typed property during assignment --- .../typed_properties_089.phpt | 38 +++++++++++++++++++ Zend/zend_object_handlers.c | 5 ++- 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_089.phpt 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 000000000000..1d59b8d945a2 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_089.phpt @@ -0,0 +1,38 @@ +--TEST-- +Modification of typed property during assignment must not leak +--FILE-- +prop = "dont "; + $a->prop .= "leak "; + $a->prop .= "me!"; + return "test"; + } +} + +$a = new A; +$a->prop = new B; +var_dump($a); + +$a = new A; +$prop = &$a->prop; +$a->prop = new B; +var_dump($a); + +?> +--EXPECTF-- +object(A)#1 (1) { + ["prop"]=> + string(4) "test" +} +object(A)#%d (1) { + ["prop"]=> + &string(4) "test" +} diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 780111ad12ef..cc3133067364 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -871,6 +871,8 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, zend_property_info *prop_info; zval tmp; + variable_ptr = OBJ_PROP(zobj, property_offset); + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), name, cache_slot))) { ZVAL_COPY_VALUE(&tmp, value); if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { @@ -878,9 +880,10 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, zval_ptr_dtor(value); goto exit; } + zval_ptr_dtor(variable_ptr); /* might have been updated via e.g. __toString() */ value = &tmp; } - variable_ptr = OBJ_PROP(zobj, property_offset); + ZVAL_COPY_VALUE(variable_ptr, value); } else { if (!zobj->properties) { From db13ac32db5a1925fba7bc40a6a36e8298cbb1c5 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 30 Sep 2018 22:52:38 +0200 Subject: [PATCH 333/369] Use zend_type_error() instead of zend_throw_exception_ex() --- Zend/zend_closures.c | 4 +- Zend/zend_execute.c | 71 +++++++++++---------------- Zend/zend_object_handlers.c | 19 +++----- Zend/zend_vm_def.h | 3 +- Zend/zend_vm_execute.h | 96 +++++++++++++------------------------ 5 files changed, 68 insertions(+), 125 deletions(-) diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index 05071bc77590..e2df9e43431c 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -319,10 +319,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"); } } } diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 019505e1097e..45611fbf97a6 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -885,25 +885,23 @@ ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_i } if (ZEND_TYPE_IS_CLASS(info->type)) { - zend_throw_exception_ex(zend_ce_type_error, info->type, - "Typed property %s::$%s must be an instance of %s%s, %s used", - ZSTR_VAL(info->ce->name), - ZSTR_VAL(info->name), - ZSTR_VAL(ZEND_TYPE_IS_CE(info->type) ? ZEND_TYPE_CE(info->type)->name : zend_resolve_property_type(ZEND_TYPE_NAME(info->type), info->ce)), - 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))); + zend_type_error("Typed property %s::$%s must be an instance of %s%s, %s used", + ZSTR_VAL(info->ce->name), + ZSTR_VAL(info->name), + ZSTR_VAL(ZEND_TYPE_IS_CE(info->type) ? ZEND_TYPE_CE(info->type)->name : zend_resolve_property_type(ZEND_TYPE_NAME(info->type), info->ce)), + 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_throw_exception_ex(zend_ce_type_error, info->type, - "Typed property %s::$%s must be %s%s, %s used", - ZSTR_VAL(info->ce->name), - ZSTR_VAL(info->name), - zend_get_type_by_const(ZEND_TYPE_CODE(info->type)), - 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))); + zend_type_error("Typed property %s::$%s must be %s%s, %s used", + ZSTR_VAL(info->ce->name), + ZSTR_VAL(info->name), + zend_get_type_by_const(ZEND_TYPE_CODE(info->type)), + 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))); } } @@ -1547,8 +1545,7 @@ static ZEND_COLD zend_bool zend_ref_verify_assign_incdec_double(zend_reference * { zend_property_info *error_prop; if ((error_prop = zend_ref_accepts_double(ref))) { - zend_throw_exception_ex(zend_ce_type_error, 0, - "Cannot %screment a reference held by property %s::$%s of type %sint past its %simal value", + zend_type_error("Cannot %screment a reference held by property %s::$%s of type %sint past its %simal value", inc ? "in" : "de", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name), @@ -1601,8 +1598,7 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i } } else { ZEND_ASSERT(ZEND_TYPE_CODE(prop_info->type) == IS_LONG); - zend_throw_exception_ex(zend_ce_type_error, 0, - "Cannot %screment a property %s::$%s of type %sint past its %simal value", + zend_type_error("Cannot %screment a property %s::$%s of type %sint past its %simal value", inc ? "in" : "de", ZSTR_VAL(prop_info->ce->name), ZSTR_VAL(prop_info->name), @@ -1679,8 +1675,7 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ } } else { ZEND_ASSERT(ZEND_TYPE_CODE(prop_info->type) == IS_LONG); - zend_throw_exception_ex(zend_ce_type_error, 0, - "Cannot %screment a property %s::$%s of type %sint past its %simal value", + zend_type_error("Cannot %screment a property %s::$%s of type %sint past its %simal value", inc ? "in" : "de", ZSTR_VAL(prop_info->ce->name), ZSTR_VAL(prop_info->name), @@ -2172,8 +2167,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * if (type != BP_VAR_UNSET) { zend_property_info *error_prop; if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_container))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); ZVAL_ERROR(result); @@ -2522,8 +2516,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (UNEXPECTED(prop_info)) { if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(ptr) <= IS_FALSE || (Z_ISREF_P(ptr) && Z_TYPE_P(Z_REFVAL_P(ptr)) == IS_NULL))) { if (!zend_verify_type_assignable(prop_info->type, IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Cannot write an array to a null property %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null property %s::$%s which does not allow for array", ZSTR_VAL(prop_info->ce->name), ZSTR_VAL(prop_info->name)); ZVAL_UNDEF(ptr); @@ -2678,9 +2671,7 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, && UNEXPECTED(Z_TYPE_P(*retval) == IS_UNDEF) && UNEXPECTED(property_info->type != 0)) { const char *class_name, *prop_name; zend_unmangle_property_name_ex(property_info->name, &class_name, &prop_name, NULL); - zend_throw_exception_ex(zend_ce_type_error, - ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), - "Typed static property %s::$%s must not be accessed before initialization", + zend_type_error("Typed static property %s::$%s must not be accessed before initialization", ZSTR_VAL(property_info->ce->name), prop_name); return FAILURE; @@ -2696,8 +2687,7 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(*retval) <= IS_FALSE || (Z_ISREF_P(*retval) && Z_TYPE_P(Z_REFVAL_P(*retval)) == IS_NULL)) && !zend_verify_type_assignable(property_info->type, IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), - "Cannot write an array to a null property %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null property %s::$%s which does not allow for array", ZSTR_VAL(property_info->ce->name), ZSTR_VAL(property_info->name)); return FAILURE; @@ -2751,9 +2741,7 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1 const char *class_name1, *class_name2, *prop_name1, *prop_name2; zend_unmangle_property_name_ex(prop1->name, &class_name1, &prop_name1, NULL); zend_unmangle_property_name_ex(prop2->name, &class_name2, &prop_name2, NULL); - zend_throw_exception_ex( - zend_ce_type_error, 0, - "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", + 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), prop_name1, @@ -2767,9 +2755,7 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1 } ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zval *zv) { - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Cannot assign %s to reference held by property %s::$%s of type %s%s", + 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), ZSTR_VAL(prop->name), @@ -2778,11 +2764,8 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, ); } -ZEND_API ZEND_COLD void zend_throw_conflicting_coercion_error( - zend_property_info *prop1, zend_property_info *prop2, zval *zv) { - zend_throw_exception_ex( - zend_ce_type_error, 0, - "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", +ZEND_API ZEND_COLD void zend_throw_conflicting_coercion_error(zend_property_info *prop1, zend_property_info *prop2, zval *zv) { + 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), ZSTR_VAL(prop1->name), diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index cc3133067364..b7abc84c619e 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -761,12 +761,9 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void if ((type != BP_VAR_IS)) { if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), name, cache_slot))) { - if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(prop_info->type) || Z_TYPE_P(retval) == IS_UNDEF)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - ZSTR_VAL(name)); - } + zend_type_error("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)); } @@ -784,7 +781,7 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, { zend_object *zobj; zend_string *name, *tmp_name; - zval *variable_ptr; + zval *variable_ptr, tmp; uintptr_t property_offset; zobj = Z_OBJ_P(object); @@ -796,7 +793,6 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, variable_ptr = OBJ_PROP(zobj, property_offset); if (Z_TYPE_P(variable_ptr) != IS_UNDEF) { zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), name, cache_slot); - zval tmp; Z_TRY_ADDREF_P(value); @@ -869,7 +865,6 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, } if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) { zend_property_info *prop_info; - zval tmp; variable_ptr = OBJ_PROP(zobj, property_offset); @@ -880,8 +875,8 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, zval_ptr_dtor(value); goto exit; } - zval_ptr_dtor(variable_ptr); /* might have been updated via e.g. __toString() */ value = &tmp; + goto found; /* might have been updated via e.g. __toString() */ } ZVAL_COPY_VALUE(variable_ptr, value); @@ -1489,9 +1484,7 @@ ZEND_API zval *zend_std_get_static_property_with_info(zend_class_entry *ce, zend if (UNEXPECTED((type == BP_VAR_R || type == BP_VAR_RW) && Z_TYPE_P(ret) == IS_UNDEF && property_info->type != 0)) { - zend_throw_exception_ex(zend_ce_type_error, - ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), - "Typed static property %s::$%s must not be accessed before initialization", + zend_type_error("Typed static property %s::$%s must not be accessed before initialization", ZSTR_VAL(property_info->ce->name), ZSTR_VAL(property_name)); return NULL; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 51341c417e91..b168a1e3f3eb 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2592,8 +2592,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array): } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); FREE_UNFETCHED_OP2(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a1f1a5559e17..6e2208d492c7 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -26119,8 +26119,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -26242,8 +26241,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -26365,8 +26363,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -26487,8 +26484,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -29060,8 +29056,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -29183,8 +29178,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -29306,8 +29300,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -29428,8 +29421,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -31048,8 +31040,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -31171,8 +31162,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -31294,8 +31284,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -31416,8 +31405,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -33606,8 +33594,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -33729,8 +33716,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -33852,8 +33838,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -33974,8 +33959,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -46500,8 +46484,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -46623,8 +46606,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -46746,8 +46728,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -46868,8 +46849,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -50838,8 +50818,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50961,8 +50940,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -51084,8 +51062,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -51206,8 +51183,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -54117,8 +54093,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -54240,8 +54215,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -54363,8 +54337,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -54485,8 +54458,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -57743,8 +57715,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -57866,8 +57837,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -57989,8 +57959,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -58111,8 +58080,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); From a119939723e6feb129f564c8cb38fa447b04ea32 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 30 Sep 2018 23:41:03 +0200 Subject: [PATCH 334/369] Fix unsetting shadowed typed properties holding a reference --- .../typed_properties_090.phpt | 25 +++++++++++++++++++ Zend/zend_object_handlers.c | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_090.phpt 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 000000000000..3b75aaa8433d --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_090.phpt @@ -0,0 +1,25 @@ +--TEST-- +Unsetting typed properties containing a reference must respect shadowing +--FILE-- +prop; + unset($this->prop); + $x = "foo"; + var_dump($x); + } +} +class B extends A { + private $prop; +} + +$b = new B; +$b->test(); + +?> +--EXPECT-- +string(3) "foo" diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index b7abc84c619e..09103e79b8b2 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -1077,7 +1077,7 @@ ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_s if (Z_TYPE_P(slot) != IS_UNDEF) { if (UNEXPECTED(Z_ISREF_P(slot)) && Z_REFCOUNT_P(slot) > 1) { - zend_property_info *prop_info = zend_hash_find_ptr(&zobj->ce->properties_info, name); + zend_property_info *prop_info = zend_object_fetch_property_type_info(zobj->ce, name, cache_slot); if (UNEXPECTED(prop_info->type)) { ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(slot), prop_info); } From f6209ee2cdd1d5de96d9729d772cfa511938eb0f Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 1 Oct 2018 16:44:29 +0200 Subject: [PATCH 335/369] Make all uninit access Error instead of TypeError & properly unmangle prop names --- .../typed_properties_002.phpt | 2 +- .../typed_properties_026.phpt | 2 +- .../typed_properties_069.phpt | 2 +- .../typed_properties_080.phpt | 6 +- .../typed_properties_083.phpt | 4 +- Zend/zend_compile.h | 6 ++ Zend/zend_execute.c | 47 ++++++-------- Zend/zend_object_handlers.c | 8 +-- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 64 +++++++++---------- 10 files changed, 70 insertions(+), 73 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_002.phpt b/Zend/tests/type_declarations/typed_properties_002.phpt index facaee077e0b..c4698d81e602 100644 --- a/Zend/tests/type_declarations/typed_properties_002.phpt +++ b/Zend/tests/type_declarations/typed_properties_002.phpt @@ -9,7 +9,7 @@ $thing = new class() { var_dump($thing->int); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property class@anonymous::$int must not be accessed before initialization in %s:6 +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_026.phpt b/Zend/tests/type_declarations/typed_properties_026.phpt index 250ea060508c..d3b512f6f184 100644 --- a/Zend/tests/type_declarations/typed_properties_026.phpt +++ b/Zend/tests/type_declarations/typed_properties_026.phpt @@ -16,7 +16,7 @@ class Baz{ var_dump((new Baz)->get()); --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Baz::$baz must not be accessed before initialization in %s:10 +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} diff --git a/Zend/tests/type_declarations/typed_properties_069.phpt b/Zend/tests/type_declarations/typed_properties_069.phpt index fa1f60ce8461..fa71c07471e3 100644 --- a/Zend/tests/type_declarations/typed_properties_069.phpt +++ b/Zend/tests/type_declarations/typed_properties_069.phpt @@ -17,7 +17,7 @@ try { } catch (TypeError $e) { print $e->getMessage()."\n"; } try { var_dump(Foo::$i); -} catch (TypeError $e) { print $e->getMessage()."\n"; } +} catch (Error $e) { print $e->getMessage()."\n"; } var_dump(nonNumericStringRef()); ?> diff --git a/Zend/tests/type_declarations/typed_properties_080.phpt b/Zend/tests/type_declarations/typed_properties_080.phpt index 18f7a7cf3bd8..ff4a2f33de67 100644 --- a/Zend/tests/type_declarations/typed_properties_080.phpt +++ b/Zend/tests/type_declarations/typed_properties_080.phpt @@ -11,17 +11,17 @@ class Test { static function run() { try { self::$a; - } catch (TypeError $e) { + } catch (Error $e) { echo $e->getMessage(), "\n"; } try { self::$b; - } catch (TypeError $e) { + } catch (Error $e) { echo $e->getMessage(), "\n"; } try { self::$c; - } catch (TypeError $e) { + } catch (Error $e) { echo $e->getMessage(), "\n"; } } diff --git a/Zend/tests/type_declarations/typed_properties_083.phpt b/Zend/tests/type_declarations/typed_properties_083.phpt index b4f70287103c..638a72204a49 100644 --- a/Zend/tests/type_declarations/typed_properties_083.phpt +++ b/Zend/tests/type_declarations/typed_properties_083.phpt @@ -20,7 +20,7 @@ try { } catch (TypeError $e) { var_dump($e->getMessage()); } try { // must be uninit var_dump($a->p); -} catch (TypeError $e) { var_dump($e->getMessage()); } +} catch (Error $e) { var_dump($e->getMessage()); } Foo::$a["bar"] = 2; var_dump(Foo::$a); @@ -30,7 +30,7 @@ try { } catch (TypeError $e) { var_dump($e->getMessage()); } try { // must be uninit var_dump(Foo::$s); -} catch (TypeError $e) { var_dump($e->getMessage()); } +} catch (Error $e) { var_dump($e->getMessage()); } Foo::$a = null; $ref = &Foo::$a; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index f21257a6ece6..89f96100e456 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -780,6 +780,12 @@ ZEND_API zend_string *zend_mangle_property_name(const char *src1, size_t src1_le zend_unmangle_property_name_ex(mangled_property, class_name, prop_name, NULL) ZEND_API int zend_unmangle_property_name_ex(const zend_string *name, const char **class_name, const char **prop_name, size_t *prop_len); +static zend_always_inline const char *zend_get_mangled_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 diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 45611fbf97a6..8445ac32d419 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -887,21 +887,17 @@ ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_i 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), - ZSTR_VAL(info->name), + zend_get_mangled_property_name(info->name), ZSTR_VAL(ZEND_TYPE_IS_CE(info->type) ? ZEND_TYPE_CE(info->type)->name : zend_resolve_property_type(ZEND_TYPE_NAME(info->type), info->ce)), 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))); + 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), - ZSTR_VAL(info->name), + zend_get_mangled_property_name(info->name), zend_get_type_by_const(ZEND_TYPE_CODE(info->type)), 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))); + Z_TYPE_P(property) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(property)->name) : zend_get_type_by_const(Z_TYPE_P(property))); } } @@ -1548,7 +1544,7 @@ static ZEND_COLD zend_bool zend_ref_verify_assign_incdec_double(zend_reference * zend_type_error("Cannot %screment a reference held by property %s::$%s of type %sint past its %simal value", inc ? "in" : "de", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name), + zend_get_mangled_property_name(error_prop->name), ZEND_TYPE_ALLOW_NULL(error_prop->type) ? "?" : "", inc ? "max" : "min"); return 0; @@ -1601,7 +1597,7 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i zend_type_error("Cannot %screment a property %s::$%s of type %sint past its %simal value", inc ? "in" : "de", ZSTR_VAL(prop_info->ce->name), - ZSTR_VAL(prop_info->name), + zend_get_mangled_property_name(prop_info->name), ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", inc ? "max" : "min"); } @@ -1678,7 +1674,7 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ zend_type_error("Cannot %screment a property %s::$%s of type %sint past its %simal value", inc ? "in" : "de", ZSTR_VAL(prop_info->ce->name), - ZSTR_VAL(prop_info->name), + zend_get_mangled_property_name(prop_info->name), ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", inc ? "max" : "min"); } @@ -2169,7 +2165,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_container))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); ZVAL_ERROR(result); } else { array_init(container); @@ -2518,7 +2514,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (!zend_verify_type_assignable(prop_info->type, IS_ARRAY)) { zend_type_error("Cannot write an array to a null property %s::$%s which does not allow for array", ZSTR_VAL(prop_info->ce->name), - ZSTR_VAL(prop_info->name)); + zend_get_mangled_property_name(prop_info->name)); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); } @@ -2527,7 +2523,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (!ZEND_TYPE_ALLOW_NULL(prop_info->type) && Z_TYPE_P(ptr) == IS_NULL) { zend_throw_error(NULL, "Cannot access uninitialized non-nullable property %s::$%s by reference", ZSTR_VAL(prop_info->ce->name), - ZSTR_VAL(prop_info->name)); + zend_get_mangled_property_name(prop_info->name)); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); return; @@ -2669,11 +2665,9 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, if ((fetch_type == BP_VAR_R || fetch_type == BP_VAR_RW) && UNEXPECTED(Z_TYPE_P(*retval) == IS_UNDEF) && UNEXPECTED(property_info->type != 0)) { - const char *class_name, *prop_name; - zend_unmangle_property_name_ex(property_info->name, &class_name, &prop_name, NULL); - zend_type_error("Typed static property %s::$%s must not be accessed before initialization", + zend_throw_error(NULL, "Typed static property %s::$%s must not be accessed before initialization", ZSTR_VAL(property_info->ce->name), - prop_name); + zend_get_mangled_property_name(property_info->name)); return FAILURE; } } else { @@ -2689,7 +2683,7 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, && !zend_verify_type_assignable(property_info->type, IS_ARRAY)) { zend_type_error("Cannot write an array to a null property %s::$%s which does not allow for array", ZSTR_VAL(property_info->ce->name), - ZSTR_VAL(property_info->name)); + zend_get_mangled_property_name(property_info->name)); return FAILURE; } if ((flags & ZEND_FETCH_REF) && Z_TYPE_P(*retval) != IS_REFERENCE) { @@ -2697,7 +2691,7 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(ref) <= IS_NULL)) { zend_throw_error(NULL, "Cannot access uninitialized property %s::$%s by reference", ZSTR_VAL(property_info->ce->name), - ZSTR_VAL(property_info->name)); + zend_get_mangled_property_name(property_info->name)); return FAILURE; } if (UNEXPECTED(Z_ISUNDEF_P(ref))) { @@ -2738,17 +2732,14 @@ ZEND_API zend_property_info *zend_check_ref_array_assignable(zend_reference *ref } ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1, zend_property_info *prop2, zval *zv) { - const char *class_name1, *class_name2, *prop_name1, *prop_name2; - zend_unmangle_property_name_ex(prop1->name, &class_name1, &prop_name1, NULL); - zend_unmangle_property_name_ex(prop2->name, &class_name2, &prop_name2, NULL); 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), - prop_name1, + zend_get_mangled_property_name(prop1->name), ZEND_TYPE_ALLOW_NULL(prop1->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop1->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop1->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop1->type)), ZSTR_VAL(prop2->ce->name), - prop_name2, + zend_get_mangled_property_name(prop2->name), ZEND_TYPE_ALLOW_NULL(prop2->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop2->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop2->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop2->type)) ); @@ -2758,7 +2749,7 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, 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), - ZSTR_VAL(prop->name), + zend_get_mangled_property_name(prop->name), ZEND_TYPE_ALLOW_NULL(prop->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop->type)) ); @@ -2768,11 +2759,11 @@ ZEND_API ZEND_COLD void zend_throw_conflicting_coercion_error(zend_property_info 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), - ZSTR_VAL(prop1->name), + zend_get_mangled_property_name(prop1->name), ZEND_TYPE_ALLOW_NULL(prop1->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop1->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop1->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop1->type)), ZSTR_VAL(prop2->ce->name), - ZSTR_VAL(prop2->name), + zend_get_mangled_property_name(prop2->name), ZEND_TYPE_ALLOW_NULL(prop2->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop2->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop2->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop2->type)) ); diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 09103e79b8b2..70ebac47d422 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -761,7 +761,7 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void if ((type != BP_VAR_IS)) { if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), name, cache_slot))) { - zend_type_error("Typed property %s::$%s must not be accessed before initialization", + zend_throw_error(NULL, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(prop_info->ce->name), ZSTR_VAL(name)); } else { @@ -1078,7 +1078,7 @@ ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_s if (Z_TYPE_P(slot) != IS_UNDEF) { if (UNEXPECTED(Z_ISREF_P(slot)) && Z_REFCOUNT_P(slot) > 1) { zend_property_info *prop_info = zend_object_fetch_property_type_info(zobj->ce, name, cache_slot); - if (UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info != NULL)) { ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(slot), prop_info); } } @@ -1484,9 +1484,9 @@ ZEND_API zval *zend_std_get_static_property_with_info(zend_class_entry *ce, zend if (UNEXPECTED((type == BP_VAR_R || type == BP_VAR_RW) && Z_TYPE_P(ret) == IS_UNDEF && property_info->type != 0)) { - zend_type_error("Typed static property %s::$%s must not be accessed before initialization", + zend_throw_error(NULL, "Typed static property %s::$%s must not be accessed before initialization", ZSTR_VAL(property_info->ce->name), - ZSTR_VAL(property_name)); + zend_get_mangled_property_name(property_name)); return NULL; } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b168a1e3f3eb..f0f03f455d1e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2594,7 +2594,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array): if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); FREE_UNFETCHED_OP2(); FREE_UNFETCHED_OP_DATA(); FREE_OP1_VAR_PTR(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6e2208d492c7..8540a7e028fc 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -26121,7 +26121,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26243,7 +26243,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26365,7 +26365,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26486,7 +26486,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29058,7 +29058,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29180,7 +29180,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29302,7 +29302,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29423,7 +29423,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31042,7 +31042,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31164,7 +31164,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31286,7 +31286,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31407,7 +31407,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33596,7 +33596,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33718,7 +33718,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33840,7 +33840,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33961,7 +33961,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -46486,7 +46486,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); @@ -46608,7 +46608,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46730,7 +46730,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46851,7 +46851,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); @@ -50820,7 +50820,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50942,7 +50942,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -51064,7 +51064,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -51185,7 +51185,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -54095,7 +54095,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); @@ -54217,7 +54217,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -54339,7 +54339,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -54460,7 +54460,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); @@ -57717,7 +57717,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); @@ -57839,7 +57839,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -57961,7 +57961,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -58082,7 +58082,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); From d274d583d0ba7ce1c927eacedde4dfc213e7d4c7 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 4 Oct 2018 10:50:27 +0200 Subject: [PATCH 336/369] Fix test --- Zend/zend_object_handlers.c | 2 +- ext/reflection/tests/ReflectionProperty_typed_static.phpt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 957a7bd350f1..d4363a668fe9 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -744,7 +744,7 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void } if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) && - (prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), name, cache_slot)))) { + (prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), name, IS_VALID_PROPERTY_OFFSET(property_offset) ? cache_slot : NULL)))) { zend_verify_prop_assignable_by_ref(prop_info, retval, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES) != 0); } diff --git a/ext/reflection/tests/ReflectionProperty_typed_static.phpt b/ext/reflection/tests/ReflectionProperty_typed_static.phpt index cc69dd823044..77f95d77ef08 100644 --- a/ext/reflection/tests/ReflectionProperty_typed_static.phpt +++ b/ext/reflection/tests/ReflectionProperty_typed_static.phpt @@ -15,7 +15,7 @@ var_dump($rp->getValue()); $rp = new ReflectionProperty('Test', 'y'); try { var_dump($rp->getValue()); -} catch (TypeError $e) { +} catch (Error $e) { echo $e->getMessage(), "\n"; } From e231c31ebb5aa4f700fb4947a8481e4da175fadc Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 22 Nov 2018 17:12:18 +0100 Subject: [PATCH 337/369] Some opcache fixes Avoid writes into SHM memory. Some more work is needed for full support, e.g. we should try to resolve the types at least when preloading. --- ext/opcache/zend_accelerator_util_funcs.c | 8 ++++++++ ext/opcache/zend_persist.c | 20 +++++++++++++------- ext/opcache/zend_persist_calc.c | 20 +++++++++++++------- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index bf9eb08f7b6b..309e02c47a34 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -193,6 +193,14 @@ static void zend_hash_clone_prop_info(HashTable *ht) if (IN_ARENA(prop_info->ce)) { prop_info->ce = ARENA_REALLOC(prop_info->ce); } + + if (ZEND_TYPE_IS_CE(prop_info->type)) { + zend_class_entry *ce = ZEND_TYPE_CE(prop_info->type); + if (IN_ARENA(ce)) { + ce = ARENA_REALLOC(ce); + prop_info->type = ZEND_TYPE_ENCODE_CE(ce, ZEND_TYPE_ALLOW_NULL(prop_info->type)); + } + } } } } diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index 99454d48a4f5..1dbe78abed15 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -747,13 +747,8 @@ static void zend_persist_property_info(zval *zv) } } - if (ZEND_TYPE_IS_CLASS(prop->type)) { - zend_string *class_name; - if (ZEND_TYPE_IS_CE(prop->type)) { - class_name = zend_string_copy(ZEND_TYPE_CE(prop->type)->name); - } else { - class_name = ZEND_TYPE_NAME(prop->type); - } + if (ZEND_TYPE_IS_NAME(prop->type)) { + zend_string *class_name = ZEND_TYPE_NAME(prop->type); zend_accel_store_interned_string(class_name); prop->type = ZEND_TYPE_ENCODE_CLASS(class_name, ZEND_TYPE_ALLOW_NULL(prop->type)); } @@ -797,6 +792,16 @@ static void zend_persist_class_constant(zval *zv) } } +static zend_bool has_unresolved_property_types(zend_class_entry *ce) { + zend_property_info *prop; + ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) { + if (ZEND_TYPE_IS_NAME(prop->type)) { + return 1; + } + } ZEND_HASH_FOREACH_END(); + return 0; +} + static void zend_persist_class_entry(zval *zv) { zend_class_entry *ce = Z_PTR_P(zv); @@ -804,6 +809,7 @@ static void zend_persist_class_entry(zval *zv) if (ce->type == ZEND_USER_CLASS) { if ((ce->ce_flags & ZEND_ACC_LINKED) && (ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED) + && !has_unresolved_property_types(ce) && !ZCG(current_persistent_script)->corrupted) { ZCG(is_immutable_class) = 1; ce = Z_PTR_P(zv) = zend_shared_memdup_put(ce, sizeof(zend_class_entry)); diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c index 48c16ec8d3aa..dbb204746fb5 100644 --- a/ext/opcache/zend_persist_calc.c +++ b/ext/opcache/zend_persist_calc.c @@ -306,13 +306,8 @@ static void zend_persist_property_info_calc(zval *zv) zend_shared_alloc_register_xlat_entry(prop, prop); ADD_SIZE_EX(sizeof(zend_property_info)); ADD_INTERNED_STRING(prop->name, 0); - if (ZEND_TYPE_IS_CLASS(prop->type)) { - zend_string *class_name; - if (ZEND_TYPE_IS_CE(prop->type)) { - class_name = zend_string_copy(ZEND_TYPE_CE(prop->type)->name); - } else { - class_name = ZEND_TYPE_NAME(prop->type); - } + if (ZEND_TYPE_IS_NAME(prop->type)) { + zend_string *class_name = ZEND_TYPE_NAME(prop->type); ADD_INTERNED_STRING(class_name, 0); prop->type = ZEND_TYPE_ENCODE_CLASS(class_name, ZEND_TYPE_ALLOW_NULL(prop->type)); } @@ -336,6 +331,16 @@ static void zend_persist_class_constant_calc(zval *zv) } } +static zend_bool has_unresolved_property_types(zend_class_entry *ce) { + zend_property_info *prop; + ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) { + if (ZEND_TYPE_IS_NAME(prop->type)) { + return 1; + } + } ZEND_HASH_FOREACH_END(); + return 0; +} + static void zend_persist_class_entry_calc(zval *zv) { zend_class_entry *ce = Z_PTR_P(zv); @@ -344,6 +349,7 @@ static void zend_persist_class_entry_calc(zval *zv) ZCG(is_immutable_class) = (ce->ce_flags & ZEND_ACC_LINKED) && (ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED) && + !has_unresolved_property_types(ce) && !ZCG(current_persistent_script)->corrupted; ADD_SIZE_EX(sizeof(zend_class_entry)); From 21e405ac3271e12a4a54ebec9f689c2349dbca2b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 2 Jan 2019 15:34:46 +0100 Subject: [PATCH 338/369] Initialize unserialize_data refs --- ext/standard/var_unserializer.re | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 1971126f9085..ad80d4b1ce7f 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -58,6 +58,7 @@ PHPAPI php_unserialize_data_t php_var_unserialize_init() { d->last = &d->entries; d->first_dtor = d->last_dtor = NULL; d->allowed_classes = NULL; + d->refs = NULL; d->entries.used_slots = 0; d->entries.next = NULL; if (!BG(serialize_lock)) { From 6a272242b57288c0aa2c7136e58a7c3d711bcd61 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 10:54:09 +0100 Subject: [PATCH 339/369] Check for type violations through implicit object init This is still missing handling for the reference case --- Zend/zend_compile.c | 6 +++- Zend/zend_compile.h | 6 +++- Zend/zend_execute.c | 67 +++++++++++++++++++++++++++++++++++------- Zend/zend_vm_def.h | 7 +++-- Zend/zend_vm_execute.h | 63 +++++++++++++++++++++++++++------------ 5 files changed, 117 insertions(+), 32 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 31ae3793a6e1..d27106cea0d5 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2582,7 +2582,11 @@ static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t if (is_this_fetch(obj_ast)) { obj_node.op_type = IS_UNUSED; } else { - zend_delayed_compile_var(&obj_node, obj_ast, type, 0); + 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); diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index a8240846c0ec..0c7333425b8a 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -898,8 +898,12 @@ void zend_assert_valid_class_name(const zend_string *const_name); #define ZEND_FETCH_TYPE_MASK 0xe +// TODO We only have 2 bits of flag space in the low bits, this won't work on +// 32-bit systems #define ZEND_FETCH_REF (1<<0) -#define ZEND_FETCH_DIM_WRITE (1<<1) +#define ZEND_FETCH_DIM_WRITE (1<<1) +#define ZEND_FETCH_OBJ_WRITE (1<<2) +#define ZEND_FETCH_OBJ_FLAGS (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_FETCH_OBJ_WRITE) #define ZEND_ISEMPTY (1<<0) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 2f459ea62e6e..69098b215a54 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2435,6 +2435,34 @@ static zend_never_inline uint32_t ZEND_FASTCALL zend_array_key_exists_slow(zval } } +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) { + 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 (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; + } +} + 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 OPLINE_DC) { zval *ptr; @@ -2466,10 +2494,13 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (EXPECTED(Z_TYPE_P(ptr) != IS_UNDEF)) { return_indirect: ZVAL_INDIRECT(result, ptr); - if (flags - && (prop_op_type == IS_CONST || EXPECTED(Z_TYPE_P(prop_ptr) == IS_STRING)) - && (((flags & ZEND_FETCH_REF) && Z_TYPE_P(ptr) != IS_REFERENCE) - || ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(ptr) <= IS_FALSE || (Z_ISREF_P(ptr) && Z_TYPE_P(Z_REFVAL_P(ptr)) == IS_NULL))))) { + // TODO IS_STRING check here looks wrong. + if (flags && + (prop_op_type == IS_CONST || EXPECTED(Z_TYPE_P(prop_ptr) == IS_STRING)) && + (((flags & ZEND_FETCH_REF) && Z_TYPE_P(ptr) != IS_REFERENCE) || + ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(ptr)) || + ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(ptr))) + ) { zend_property_info *prop_info; if (prop_op_type == IS_CONST) { @@ -2480,8 +2511,8 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { - if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(ptr) <= IS_FALSE || (Z_ISREF_P(ptr) && Z_TYPE_P(Z_REFVAL_P(ptr)) == IS_NULL))) { - if (!zend_verify_type_assignable(prop_info->type, IS_ARRAY)) { + if ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(ptr)) { + if (!check_type_array_assignable(prop_info->type)) { zend_type_error("Cannot write an array to a null property %s::$%s which does not allow for array", ZSTR_VAL(prop_info->ce->name), zend_get_mangled_property_name(prop_info->name)); @@ -2490,6 +2521,16 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } return; } + if ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(ptr)) { + if (!check_type_stdClass_assignable(prop_info->type)) { + zend_type_error("Cannot write an stdClass to a null property %s::$%s which does not allow for stdClass", + ZSTR_VAL(prop_info->ce->name), + zend_get_mangled_property_name(prop_info->name)); + ZVAL_UNDEF(ptr); + ZVAL_ERROR(result); + } + return; + } if (!ZEND_TYPE_ALLOW_NULL(prop_info->type) && Z_TYPE_P(ptr) == IS_NULL) { zend_throw_error(NULL, "Cannot access uninitialized non-nullable property %s::$%s by reference", ZSTR_VAL(prop_info->ce->name), @@ -2635,14 +2676,20 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } if (flags) { - if ((flags & ZEND_FETCH_DIM_WRITE) - && (Z_TYPE_P(*retval) <= IS_FALSE || (Z_ISREF_P(*retval) && Z_TYPE_P(Z_REFVAL_P(*retval)) == IS_NULL)) - && !zend_verify_type_assignable(property_info->type, IS_ARRAY)) { + if ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(*retval) + && !check_type_array_assignable(property_info->type)) { zend_type_error("Cannot write an array to a null property %s::$%s which does not allow for array", ZSTR_VAL(property_info->ce->name), zend_get_mangled_property_name(property_info->name)); return FAILURE; } + if ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(*retval) + && !check_type_stdClass_assignable(property_info->type)) { + zend_type_error("Cannot write an stdClass to a null property %s::$%s which does not allow for stdClass", + ZSTR_VAL(property_info->ce->name), + zend_get_mangled_property_name(property_info->name)); + return FAILURE; + } if ((flags & ZEND_FETCH_REF) && Z_TYPE_P(*retval) != IS_REFERENCE) { zval *ref = *retval; if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(ref) <= IS_NULL)) { @@ -2677,7 +2724,7 @@ static zend_always_inline zend_property_info *i_zend_check_ref_array_assignable( } ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { - if (ZEND_TYPE_IS_CLASS(prop->type) || (ZEND_TYPE_CODE(prop->type) != IS_ITERABLE && ZEND_TYPE_CODE(prop->type) != IS_ARRAY)) { + if (!check_type_array_assignable(prop->type)) { return prop; } } ZEND_REF_FOREACH_TYPE_SOURCES_END(); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 74b34b57e77c..b07a664ae1e5 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1794,7 +1794,7 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -2101,7 +2101,10 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH 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 & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) 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 OPLINE_CC); FREE_OP2(); if (OP1_TYPE == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6553cb8f1ef5..24ebb18ec57a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4652,7 +4652,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -8521,7 +8521,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -9438,7 +9438,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -14789,7 +14789,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -17492,7 +17492,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -18170,7 +18170,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -25483,7 +25483,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 & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) 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 OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -28384,7 +28387,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 & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) 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 OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -32888,7 +32894,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 & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) 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 OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -35540,7 +35549,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 & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) 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 OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -37529,7 +37541,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 & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) 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 OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -40165,7 +40180,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 & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) 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 OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -44982,7 +45000,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -45265,7 +45283,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 & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) 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 OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -49848,7 +49869,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 & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) 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 OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -52191,7 +52215,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -53469,7 +53493,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -56732,7 +56756,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 & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) 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 OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); From 25a517c22eb96614a3d016fa97b224ed9900c1a6 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 12:02:50 +0100 Subject: [PATCH 340/369] Handle the reference case as well --- Zend/zend_execute.c | 140 ++++++---- Zend/zend_vm_def.h | 36 ++- Zend/zend_vm_execute.h | 567 ++++++++++++++++++----------------------- 3 files changed, 365 insertions(+), 378 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 69098b215a54..f1ec39864466 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -634,16 +634,20 @@ static zend_never_inline ZEND_COLD int zend_wrong_assign_to_variable_reference(z return 1; } +static zend_always_inline zend_property_info *i_zend_check_ref_stdClass_assignable(zend_reference *ref); + /* this should modify object only if it's empty */ -static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC) +static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC) { zend_object *obj; + zval *ref = NULL; + if (Z_ISREF_P(object)) { + ref = object; + object = Z_REFVAL_P(object); + } - if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE)) { - /* nothing to destroy */ - } else if (EXPECTED((Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) { - zval_ptr_dtor_nogc(object); - } else { + if (UNEXPECTED(Z_TYPE_P(object) > IS_FALSE && + (Z_TYPE_P(object) != IS_STRING || Z_STRLEN_P(object) != 0))) { if (opline->op1_type != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) { zend_string *tmp_property_name; zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name); @@ -661,8 +665,23 @@ static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object(zval *obje if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - return 0; + return NULL; + } + + if (ref) { + zend_property_info *error_prop = i_zend_check_ref_stdClass_assignable(Z_REF_P(ref)); + if (error_prop) { + zend_type_error("Cannot write an stdClass to a null or false reference held by %s::$%s which does not allow for stdClass", + ZSTR_VAL(error_prop->ce->name), + zend_get_mangled_property_name(error_prop->name)); + if (RETURN_VALUE_USED(opline)) { + ZVAL_UNDEF(EX_VAR(opline->result.var)); + } + return NULL; + } } + + zval_ptr_dtor_nogc(object); object_init(object); Z_ADDREF_P(object); obj = Z_OBJ_P(object); @@ -673,29 +692,47 @@ static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object(zval *obje if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - return 0; + return NULL; } Z_DELREF_P(object); - return 1; + return object; } -static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object_rw(zval *object, zval *property OPLINE_DC) +static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object_rw(zval *object, zval *property OPLINE_DC) { - if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE)) { - /* nothing to destroy */ - } else if (EXPECTED((Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) { - zval_ptr_dtor_nogc(object); - } else { + zval *ref = NULL; + if (Z_ISREF_P(object)) { + ref = object; + object = Z_REFVAL_P(object); + } + + if (UNEXPECTED(Z_TYPE_P(object) > IS_FALSE && + (Z_TYPE_P(object) != IS_STRING || Z_STRLEN_P(object) != 0))) { if (opline->op1_type != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) { zend_string *tmp_property_name; zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name); zend_error(E_WARNING, "Attempt to modify property '%s' of non-object", ZSTR_VAL(property_name)); zend_tmp_string_release(tmp_property_name); } - return 0; + return NULL; + } + + if (ref) { + zend_property_info *error_prop = i_zend_check_ref_stdClass_assignable(Z_REF_P(ref)); + if (error_prop) { + zend_type_error("Cannot write an stdClass to a null or false reference held by %s::$%s which does not allow for stdClass", + ZSTR_VAL(error_prop->ce->name), + zend_get_mangled_property_name(error_prop->name)); + if (RETURN_VALUE_USED(opline)) { + ZVAL_UNDEF(EX_VAR(opline->result.var)); + } + return NULL; + } } + + zval_ptr_dtor_nogc(object); object_init(object); - return 1; + return object; } static ZEND_COLD void zend_verify_type_error_common( @@ -2463,22 +2500,59 @@ static zend_always_inline zend_bool check_type_stdClass_assignable(zend_type typ } } +/* Checks whether an array can be assigned to the reference. Returns conflicting property if + * assignment is not possible, NULL otherwise. */ +static zend_always_inline zend_property_info *i_zend_check_ref_array_assignable(zend_reference *ref) { + zend_property_info *prop; + if (!ZEND_REF_HAS_TYPE_SOURCES(ref)) { + return NULL; + } + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (!check_type_array_assignable(prop->type)) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + return NULL; +} + +/* Checks whether an stdClass can be assigned to the reference. Returns conflicting property if + * assignment is not possible, NULL otherwise. */ +static zend_always_inline zend_property_info *i_zend_check_ref_stdClass_assignable(zend_reference *ref) { + zend_property_info *prop; + if (!ZEND_REF_HAS_TYPE_SOURCES(ref)) { + return NULL; + } + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (!check_type_stdClass_assignable(prop->type)) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + return NULL; +} + +ZEND_API zend_property_info *zend_check_ref_array_assignable(zend_reference *ref) { + return i_zend_check_ref_array_assignable(ref); +} + static zend_always_inline 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 OPLINE_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; } /* this should modify object only if it's empty */ - if (type == BP_VAR_UNSET || - UNEXPECTED(!make_real_object_rw(container, prop_ptr OPLINE_CC))) { + if (type == BP_VAR_UNSET) { + return; + } + + + container = make_real_object_rw(container, prop_ptr OPLINE_CC); + if (UNEXPECTED(!container)) { ZVAL_ERROR(result); return; } @@ -2715,26 +2789,6 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, return SUCCESS; } -/* Checks whether an array can be assigned to the reference. Returns conflicting property if - * assignment is not possible, NULL otherwise. */ -static zend_always_inline zend_property_info *i_zend_check_ref_array_assignable(zend_reference *ref) { - zend_property_info *prop; - if (!ZEND_REF_HAS_TYPE_SOURCES(ref)) { - return NULL; - } - - ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { - if (!check_type_array_assignable(prop->type)) { - return prop; - } - } ZEND_REF_FOREACH_TYPE_SOURCES_END(); - return NULL; -} - -ZEND_API zend_property_info *zend_check_ref_array_assignable(zend_reference *ref) { - return i_zend_check_ref_array_assignable(ref); -} - ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1, zend_property_info *prop2, zval *zv) { 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)), diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b07a664ae1e5..3913c67ea7f9 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -821,13 +821,12 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - ZEND_VM_C_GOTO(assign_op_object); - } + ZEND_VM_C_GOTO(assign_op_object); } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -1225,13 +1224,12 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, do { if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - ZEND_VM_C_GOTO(pre_incdec_object); - } + ZEND_VM_C_GOTO(pre_incdec_object); } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -1295,13 +1293,12 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, do { if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - ZEND_VM_C_GOTO(post_incdec_object); - } + ZEND_VM_C_GOTO(post_incdec_object); } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -2314,13 +2311,12 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - ZEND_VM_C_GOTO(assign_object); - } + ZEND_VM_C_GOTO(assign_object); } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { FREE_OP_DATA(); ZEND_VM_C_GOTO(exit_assign_obj); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 24ebb18ec57a..5e1ecf96994d 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -24602,13 +24602,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -25286,13 +25285,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -25355,13 +25353,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -25592,13 +25589,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -25727,13 +25723,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -25862,13 +25857,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -25997,13 +25991,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -27502,13 +27495,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -28188,13 +28180,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -28258,13 +28249,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -28497,13 +28487,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -28632,13 +28621,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -28767,13 +28755,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -28902,13 +28889,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -32164,13 +32150,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -32697,13 +32682,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -32766,13 +32750,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -33003,13 +32986,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -33138,13 +33120,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -33273,13 +33254,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -33408,13 +33388,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -35132,13 +35111,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -35317,13 +35295,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -35386,13 +35363,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -35725,13 +35701,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -35860,13 +35835,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -35995,13 +35969,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -36130,13 +36103,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -37122,13 +37094,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -37307,13 +37278,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -37377,13 +37347,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -37717,13 +37686,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -37852,13 +37820,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -37987,13 +37954,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -38122,13 +38088,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -39763,13 +39728,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -39948,13 +39912,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -40017,13 +39980,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -40356,13 +40318,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -40491,13 +40452,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -40626,13 +40586,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -40761,13 +40720,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -44137,13 +44095,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -44821,13 +44778,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -44890,13 +44846,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -45459,13 +45414,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -45594,13 +45548,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -45729,13 +45682,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -45864,13 +45816,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -48833,13 +48784,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -49519,13 +49469,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -49589,13 +49538,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -50045,13 +49993,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -50180,13 +50127,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -50315,13 +50261,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -50450,13 +50395,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -55875,13 +55819,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -56408,13 +56351,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -56477,13 +56419,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -56932,13 +56873,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -57067,13 +57007,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -57202,13 +57141,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -57337,13 +57275,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } From cca6c1c20746e7bcb7ed78ad13d7285a02d65be9 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 12:08:27 +0100 Subject: [PATCH 341/369] Remove incorrect string check, add tests --- .../typed_properties_091.phpt | 166 ++++++++++++++++++ Zend/zend_execute.c | 2 - 2 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_091.phpt 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 000000000000..cda0a8be85f1 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_091.phpt @@ -0,0 +1,166 @@ +--TEST-- +Automatic promotion of falsy to object +--FILE-- +prop->wat = 123; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +$test->stdProp->wat = 123; +$test->objectProp->wat = 123; +var_dump($test); + +// Object properties via reference +$test = new Test; +$prop =& $test->prop; +$stdProp =& $test->stdProp; +$objectProp =& $test->objectProp; +try { + $prop->wat = 123; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +$stdProp->wat = 123; +$objectProp->wat = 123; +var_dump($test); + +// Object properties via reference rw +$test = new Test; +$prop =& $test->prop; +$stdProp =& $test->stdProp; +$objectProp =& $test->objectProp; +try { + $prop->wat->wat = 123; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +$stdProp->wat->wat = 123; +$objectProp->wat->wat = 123; +var_dump($test); + +// Static properties +try { + Test::$staticProp->wat = 123; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +Test::$staticStdProp->wat = 123; +Test::$staticObjectProp->wat = 123; +var_dump(Test::$staticProp, Test::$staticStdProp, Test::$staticObjectProp); + +// Non-string property name +$test = new Test; +$propName = new class { + public function __toString() { + return 'prop'; + } +}; +try { + $test->$propName->wat = 123; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test); + +?> +--EXPECTF-- +Cannot write an stdClass to a null property Test::$prop which does not allow for stdClass + +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 write an stdClass to a null or false reference held by Test::$prop which does not allow for stdClass + +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 write an stdClass to a null or false reference held by Test::$prop which does not allow for stdClass + +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 write an stdClass to a null property Test::$staticProp which does not allow for stdClass + +Warning: Creating default object from empty value in /home/nikic/php-src-refs/Zend/tests/type_declarations/typed_properties_091.php on line 58 + +Warning: Creating default object from empty value in /home/nikic/php-src-refs/Zend/tests/type_declarations/typed_properties_091.php on line 59 +NULL +object(stdClass)#4 (1) { + ["wat"]=> + int(123) +} +object(stdClass)#8 (1) { + ["wat"]=> + int(123) +} +Cannot write an stdClass to a null property Test::$prop which does not allow for stdClass +object(Test)#9 (0) { + ["prop"]=> + uninitialized(?Test) + ["stdProp"]=> + uninitialized(?stdClass) + ["objectProp"]=> + uninitialized(?object) +} diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index f1ec39864466..b4f263b4bd80 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2568,9 +2568,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (EXPECTED(Z_TYPE_P(ptr) != IS_UNDEF)) { return_indirect: ZVAL_INDIRECT(result, ptr); - // TODO IS_STRING check here looks wrong. if (flags && - (prop_op_type == IS_CONST || EXPECTED(Z_TYPE_P(prop_ptr) == IS_STRING)) && (((flags & ZEND_FETCH_REF) && Z_TYPE_P(ptr) != IS_REFERENCE) || ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(ptr)) || ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(ptr))) From 373579c1a3bf5517af3acbb3c816976a02575a57 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 12:11:46 +0100 Subject: [PATCH 342/369] Check for no type in "type_assignable" functions --- Zend/zend_execute.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index b4f263b4bd80..d62c293a7df8 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2484,11 +2484,17 @@ static zend_always_inline zend_bool promotes_to_object(zval *val) { } 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; From 92cfec9e36a1b3edef6c162256ddf258a7e85584 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 12:39:19 +0100 Subject: [PATCH 343/369] Improve auto-initialization related error messages Also add a zend_format_type helper to unify type formatting. --- .../typed_properties_083.phpt | 8 +- .../typed_properties_091.phpt | 10 +- Zend/zend_execute.c | 86 +++++-- Zend/zend_vm_def.h | 7 +- Zend/zend_vm_execute.h | 224 +++++++++++++----- 5 files changed, 236 insertions(+), 99 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_083.phpt b/Zend/tests/type_declarations/typed_properties_083.phpt index 638a72204a49..91aed8b4b27e 100644 --- a/Zend/tests/type_declarations/typed_properties_083.phpt +++ b/Zend/tests/type_declarations/typed_properties_083.phpt @@ -54,19 +54,19 @@ array(1) { [0]=> int(1) } -string(79) "Cannot write an array to a null property Foo::$p which does not allow for array" +string(72) "Cannot auto-initialize and array inside property Foo::$p of type ?string" string(65) "Typed property Foo::$p must not be accessed before initialization" array(1) { ["bar"]=> int(2) } -string(79) "Cannot write an array to a null property Foo::$s which does not allow for array" +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(97) "Cannot write an array to a null or false reference held by Foo::$p which does not allow for array" +string(91) "Cannot auto-initialize an array inside a reference held by property Foo::$p of type ?string" NULL -string(97) "Cannot write an array to a null or false reference held by Foo::$p which does not allow for array" +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_091.phpt b/Zend/tests/type_declarations/typed_properties_091.phpt index cda0a8be85f1..47dc8b7f2460 100644 --- a/Zend/tests/type_declarations/typed_properties_091.phpt +++ b/Zend/tests/type_declarations/typed_properties_091.phpt @@ -78,7 +78,7 @@ var_dump($test); ?> --EXPECTF-- -Cannot write an stdClass to a null property Test::$prop which does not allow for stdClass +Cannot auto-initialize an stdClass inside property Test::$prop of type ?Test Warning: Creating default object from empty value in %s on line %d @@ -97,7 +97,7 @@ object(Test)#1 (2) { int(123) } } -Cannot write an stdClass to a null or false reference held by Test::$prop which does not allow for stdClass +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 @@ -116,7 +116,7 @@ object(Test)#5 (3) { int(123) } } -Cannot write an stdClass to a null or false reference held by Test::$prop which does not allow for stdClass +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 @@ -141,7 +141,7 @@ object(Test)#3 (3) { } } } -Cannot write an stdClass to a null property Test::$staticProp which does not allow for stdClass +Cannot auto-initialize an stdClass inside property Test::$staticProp of type ?Test Warning: Creating default object from empty value in /home/nikic/php-src-refs/Zend/tests/type_declarations/typed_properties_091.php on line 58 @@ -155,7 +155,7 @@ object(stdClass)#8 (1) { ["wat"]=> int(123) } -Cannot write an stdClass to a null property Test::$prop which does not allow for stdClass +Cannot auto-initialize an stdClass inside property Test::$prop of type ?Test object(Test)#9 (0) { ["prop"]=> uninitialized(?Test) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index d62c293a7df8..affb6d1cb82b 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -636,6 +636,20 @@ static zend_never_inline ZEND_COLD int zend_wrong_assign_to_variable_reference(z static zend_always_inline zend_property_info *i_zend_check_ref_stdClass_assignable(zend_reference *ref); +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)); + } +} + + /* this should modify object only if it's empty */ static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC) { @@ -671,9 +685,12 @@ static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object(zval *ob if (ref) { zend_property_info *error_prop = i_zend_check_ref_stdClass_assignable(Z_REF_P(ref)); if (error_prop) { - zend_type_error("Cannot write an stdClass to a null or false reference held by %s::$%s which does not allow for stdClass", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an stdClass inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); if (RETURN_VALUE_USED(opline)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); } @@ -720,9 +737,12 @@ static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object_rw(zval if (ref) { zend_property_info *error_prop = i_zend_check_ref_stdClass_assignable(Z_REF_P(ref)); if (error_prop) { - zend_type_error("Cannot write an stdClass to a null or false reference held by %s::$%s which does not allow for stdClass", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an stdClass inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); if (RETURN_VALUE_USED(opline)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); } @@ -2137,9 +2157,12 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * if (type != BP_VAR_UNSET) { zend_property_info *error_prop; if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_container))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); ZVAL_ERROR(result); } else { array_init(container); @@ -2591,9 +2614,12 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (UNEXPECTED(prop_info)) { if ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(ptr)) { if (!check_type_array_assignable(prop_info->type)) { - zend_type_error("Cannot write an array to a null property %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(prop_info->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize and array inside property %s::$%s of type %s%s", ZSTR_VAL(prop_info->ce->name), - zend_get_mangled_property_name(prop_info->name)); + zend_get_mangled_property_name(prop_info->name), + prop_type1, prop_type2); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); } @@ -2601,9 +2627,12 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } if ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(ptr)) { if (!check_type_stdClass_assignable(prop_info->type)) { - zend_type_error("Cannot write an stdClass to a null property %s::$%s which does not allow for stdClass", + const char *prop_type1, *prop_type2; + zend_format_type(prop_info->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an stdClass inside property %s::$%s of type %s%s", ZSTR_VAL(prop_info->ce->name), - zend_get_mangled_property_name(prop_info->name)); + zend_get_mangled_property_name(prop_info->name), + prop_type1, prop_type2); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); } @@ -2756,16 +2785,22 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, if (flags) { if ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(*retval) && !check_type_array_assignable(property_info->type)) { - zend_type_error("Cannot write an array to a null property %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(property_info->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside property %s::$%s of type %s%s", ZSTR_VAL(property_info->ce->name), - zend_get_mangled_property_name(property_info->name)); + zend_get_mangled_property_name(property_info->name), + prop_type1, prop_type2); return FAILURE; } if ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(*retval) && !check_type_stdClass_assignable(property_info->type)) { - zend_type_error("Cannot write an stdClass to a null property %s::$%s which does not allow for stdClass", + const char *prop_type1, *prop_type2; + zend_format_type(property_info->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an stdClass inside property %s::$%s of type %s%s", ZSTR_VAL(property_info->ce->name), - zend_get_mangled_property_name(property_info->name)); + zend_get_mangled_property_name(property_info->name), + prop_type1, prop_type2); return FAILURE; } if ((flags & ZEND_FETCH_REF) && Z_TYPE_P(*retval) != IS_REFERENCE) { @@ -2794,40 +2829,43 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } 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_mangled_property_name(prop1->name), - ZEND_TYPE_ALLOW_NULL(prop1->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop1->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop1->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop1->type)), + prop1_type1, prop1_type2, ZSTR_VAL(prop2->ce->name), zend_get_mangled_property_name(prop2->name), - ZEND_TYPE_ALLOW_NULL(prop2->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop2->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop2->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop2->type)) + 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_mangled_property_name(prop->name), - ZEND_TYPE_ALLOW_NULL(prop->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop->type)) + 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_mangled_property_name(prop1->name), - ZEND_TYPE_ALLOW_NULL(prop1->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop1->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop1->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop1->type)), + prop1_type1, prop1_type2, ZSTR_VAL(prop2->ce->name), zend_get_mangled_property_name(prop2->name), - ZEND_TYPE_ALLOW_NULL(prop2->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop2->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop2->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop2->type)) + prop2_type1, prop2_type2 ); } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index e7a1551399d7..98f8851c5501 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2580,9 +2580,12 @@ ZEND_VM_C_LABEL(try_assign_dim_array): } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); FREE_UNFETCHED_OP2(); FREE_UNFETCHED_OP_DATA(); FREE_OP1_VAR_PTR(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 75d29278ba6a..099e6e79f54b 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -26192,9 +26192,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26314,9 +26317,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26436,9 +26442,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26557,9 +26566,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29090,9 +29102,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29212,9 +29227,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29334,9 +29352,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29455,9 +29476,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31066,9 +31090,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31188,9 +31215,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31310,9 +31340,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31431,9 +31464,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33589,9 +33625,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33711,9 +33750,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33833,9 +33875,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33954,9 +33999,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -46285,9 +46333,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); @@ -46407,9 +46458,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46529,9 +46583,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46650,9 +46707,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); @@ -50596,9 +50656,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50718,9 +50781,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -50840,9 +50906,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -50961,9 +51030,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -53889,9 +53961,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); @@ -54011,9 +54086,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -54133,9 +54211,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -54254,9 +54335,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); @@ -57476,9 +57560,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); @@ -57598,9 +57685,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -57720,9 +57810,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -57841,9 +57934,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); From ac1ac47ad7d82d889fc594b3c7117fcbe9bebda3 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 12:55:51 +0100 Subject: [PATCH 344/369] Extract auto-init errors into cold helpers Also fixing a typo in one of the many cases where this was copy&pasted. --- .../typed_properties_083.phpt | 2 +- Zend/zend_execute.c | 71 +++--- Zend/zend_vm_def.h | 7 +- Zend/zend_vm_execute.h | 224 +++--------------- 4 files changed, 63 insertions(+), 241 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_083.phpt b/Zend/tests/type_declarations/typed_properties_083.phpt index 91aed8b4b27e..6d34cd7d6d3b 100644 --- a/Zend/tests/type_declarations/typed_properties_083.phpt +++ b/Zend/tests/type_declarations/typed_properties_083.phpt @@ -54,7 +54,7 @@ array(1) { [0]=> int(1) } -string(72) "Cannot auto-initialize and array inside property Foo::$p of type ?string" +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" array(1) { ["bar"]=> diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index affb6d1cb82b..442ec51c8a9c 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -649,6 +649,28 @@ static void zend_format_type(zend_type type, const char **part1, const char **pa } } +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_mangled_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_mangled_property_name(prop->name), + prop_type1, prop_type2 + ); +} + /* this should modify object only if it's empty */ static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC) @@ -685,12 +707,7 @@ static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object(zval *ob if (ref) { zend_property_info *error_prop = i_zend_check_ref_stdClass_assignable(Z_REF_P(ref)); if (error_prop) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an stdClass inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "stdClass"); if (RETURN_VALUE_USED(opline)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); } @@ -737,12 +754,7 @@ static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object_rw(zval if (ref) { zend_property_info *error_prop = i_zend_check_ref_stdClass_assignable(Z_REF_P(ref)); if (error_prop) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an stdClass inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "stdClass"); if (RETURN_VALUE_USED(opline)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); } @@ -2157,12 +2169,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * if (type != BP_VAR_UNSET) { zend_property_info *error_prop; if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_container))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); ZVAL_ERROR(result); } else { array_init(container); @@ -2614,12 +2621,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (UNEXPECTED(prop_info)) { if ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(ptr)) { if (!check_type_array_assignable(prop_info->type)) { - const char *prop_type1, *prop_type2; - zend_format_type(prop_info->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize and array inside property %s::$%s of type %s%s", - ZSTR_VAL(prop_info->ce->name), - zend_get_mangled_property_name(prop_info->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_prop_error(prop_info, "array"); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); } @@ -2627,12 +2629,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } if ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(ptr)) { if (!check_type_stdClass_assignable(prop_info->type)) { - const char *prop_type1, *prop_type2; - zend_format_type(prop_info->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an stdClass inside property %s::$%s of type %s%s", - ZSTR_VAL(prop_info->ce->name), - zend_get_mangled_property_name(prop_info->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_prop_error(prop_info, "stdClass"); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); } @@ -2785,22 +2782,12 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, if (flags) { if ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(*retval) && !check_type_array_assignable(property_info->type)) { - const char *prop_type1, *prop_type2; - zend_format_type(property_info->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside property %s::$%s of type %s%s", - ZSTR_VAL(property_info->ce->name), - zend_get_mangled_property_name(property_info->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_prop_error(property_info, "array"); return FAILURE; } if ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(*retval) && !check_type_stdClass_assignable(property_info->type)) { - const char *prop_type1, *prop_type2; - zend_format_type(property_info->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an stdClass inside property %s::$%s of type %s%s", - ZSTR_VAL(property_info->ce->name), - zend_get_mangled_property_name(property_info->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_prop_error(property_info, "stdClass"); return FAILURE; } if ((flags & ZEND_FETCH_REF) && Z_TYPE_P(*retval) != IS_REFERENCE) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 98f8851c5501..0c94db72c578 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2580,12 +2580,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array): } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); FREE_UNFETCHED_OP2(); FREE_UNFETCHED_OP_DATA(); FREE_OP1_VAR_PTR(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 099e6e79f54b..c6a39f4b6b57 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -26192,12 +26192,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26317,12 +26312,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26442,12 +26432,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26566,12 +26551,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29102,12 +29082,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29227,12 +29202,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29352,12 +29322,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29476,12 +29441,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31090,12 +31050,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31215,12 +31170,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31340,12 +31290,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31464,12 +31409,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33625,12 +33565,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33750,12 +33685,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33875,12 +33805,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33999,12 +33924,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -46333,12 +46253,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); @@ -46458,12 +46373,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46583,12 +46493,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46707,12 +46612,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); @@ -50656,12 +50556,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50781,12 +50676,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -50906,12 +50796,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -51030,12 +50915,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -53961,12 +53841,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); @@ -54086,12 +53961,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -54211,12 +54081,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -54335,12 +54200,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); @@ -57560,12 +57420,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); @@ -57685,12 +57540,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -57810,12 +57660,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -57934,12 +57779,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); From 0311fc5f7d1677cde5c96c8e71d02e35daea14b4 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 12:57:59 +0100 Subject: [PATCH 345/369] Remove hardcoded path in test --- Zend/tests/type_declarations/typed_properties_091.phpt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_091.phpt b/Zend/tests/type_declarations/typed_properties_091.phpt index 47dc8b7f2460..6b3f19fd356e 100644 --- a/Zend/tests/type_declarations/typed_properties_091.phpt +++ b/Zend/tests/type_declarations/typed_properties_091.phpt @@ -143,9 +143,9 @@ object(Test)#3 (3) { } Cannot auto-initialize an stdClass inside property Test::$staticProp of type ?Test -Warning: Creating default object from empty value in /home/nikic/php-src-refs/Zend/tests/type_declarations/typed_properties_091.php on line 58 +Warning: Creating default object from empty value in %s on line %d -Warning: Creating default object from empty value in /home/nikic/php-src-refs/Zend/tests/type_declarations/typed_properties_091.php on line 59 +Warning: Creating default object from empty value in %s on line %d NULL object(stdClass)#4 (1) { ["wat"]=> From 6574e7f59d79f84caa0ff2a6e3cfe408dcb4347e Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 13:11:18 +0100 Subject: [PATCH 346/369] Handle all FETCH_OBJ flags in opcache --- ext/opcache/Optimizer/compact_literals.c | 14 +++++++------- ext/opcache/Optimizer/zend_optimizer.c | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index a062456bb643..2df84c8539dc 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -615,12 +615,12 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx // op2 property if (opline->op1_type == IS_UNUSED && property_slot[opline->op2.constant] >= 0) { - opline->extended_value = property_slot[opline->op2.constant] | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)); + opline->extended_value = property_slot[opline->op2.constant] | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); } else { - opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)); + opline->extended_value = cache_size | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); cache_size += 3 * sizeof(void *); if (opline->op1_type == IS_UNUSED) { - property_slot[opline->op2.constant] = opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE); + property_slot[opline->op2.constant] = opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS; } } } @@ -745,17 +745,17 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx opline->op2.constant, opline->op1.constant, LITERAL_STATIC_PROPERTY, - &cache_size) | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); + &cache_size) | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); } else { - opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); + opline->extended_value = cache_size | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); cache_size += 3 * sizeof(void *); } } else if (opline->op2_type == IS_CONST) { // op2 class if (class_slot[opline->op2.constant] >= 0) { - opline->extended_value = class_slot[opline->op2.constant] | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); + opline->extended_value = class_slot[opline->op2.constant] | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); } else { - opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); + opline->extended_value = cache_size | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); class_slot[opline->op2.constant] = cache_size; cache_size += sizeof(void *); } diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 0d44a7bc13eb..0e18a2dd91c0 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -351,10 +351,10 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, case ZEND_POST_DEC_STATIC_PROP: TO_STRING_NOWARN(val); opline->op1.constant = zend_optimizer_add_literal(op_array, val); - if (opline->op2_type == IS_CONST && (opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)) + sizeof(void*) == op_array->cache_size) { + if (opline->op2_type == IS_CONST && (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) + sizeof(void*) == op_array->cache_size) { op_array->cache_size += sizeof(void *); } else { - opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); + opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); } break; case ZEND_SEND_VAR: @@ -445,7 +445,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, opline->op2.constant = zend_optimizer_add_literal(op_array, val); zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); if (opline->op1_type != IS_CONST) { - opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & (ZEND_RETURNS_FUNCTION|ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); + opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & (ZEND_RETURNS_FUNCTION|ZEND_ISEMPTY|ZEND_FETCH_OBJ_FLAGS)); } break; case ZEND_INIT_FCALL: From d44a513f83a6c6be1d5cb79408a412f5990bfc1c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 14:39:51 +0100 Subject: [PATCH 347/369] Fix static prop ref sources memory leak under opcache We also have to remove ref sources for the immutable class case. --- Zend/zend_opcode.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 2163a203befc..c38ea0855c7e 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -148,6 +148,15 @@ ZEND_API void zend_cleanup_internal_class_data(zend_class_entry *ce) ZEND_MAP_PTR_SET(ce->static_members_table, NULL); while (p != end) { + if (UNEXPECTED(Z_ISREF_P(p))) { + zend_property_info *prop_info; + ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(p), prop_info) { + if (prop_info->ce == ce && p - static_members == prop_info->offset) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); + break; /* stop iteration here, the array might be realloc()'ed */ + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + } i_zval_ptr_dtor(p); p++; } From f95ef9cc8e9a2aa888cb1972e845406ef4e72680 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 14:42:26 +0100 Subject: [PATCH 348/369] Fix fastcall use on Windows --- Zend/zend_execute.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 442ec51c8a9c..c387ce9eb8e5 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -673,7 +673,7 @@ static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_ref_error(zend_p /* this should modify object only if it's empty */ -static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *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; @@ -732,7 +732,7 @@ static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object(zval *ob return object; } -static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object_rw(zval *object, zval *property OPLINE_DC) +static zend_never_inline ZEND_COLD zval* ZEND_FASTCALL make_real_object_rw(zval *object, zval *property OPLINE_DC) { zval *ref = NULL; if (Z_ISREF_P(object)) { From c0f7ab64c29f2bb0e3507640c91c2680b449335d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 15:09:30 +0100 Subject: [PATCH 349/369] Test tweaks --- .../typed_properties_020.phpt | 25 +++++++++--------- .../typed_properties_023.phpt | 26 ++++++++++++------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt index 03fdd714b536..d32d17b1c8d4 100644 --- a/Zend/tests/type_declarations/typed_properties_020.phpt +++ b/Zend/tests/type_declarations/typed_properties_020.phpt @@ -2,12 +2,19 @@ Test typed properties binary assign op helper test --FILE-- bar += 2; - } +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(); @@ -15,11 +22,5 @@ $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_023.phpt b/Zend/tests/type_declarations/typed_properties_023.phpt index e48ae3c073e0..1531b23b9598 100644 --- a/Zend/tests/type_declarations/typed_properties_023.phpt +++ b/Zend/tests/type_declarations/typed_properties_023.phpt @@ -12,33 +12,41 @@ class Foo { public static string $s = "x"; } -var_dump(Foo::$s); -Foo::$i = 1; +var_dump(Foo::$i = 1); var_dump(Foo::$i); -Foo::$i = "1"; +var_dump(Foo::$i = "1"); var_dump(Foo::$i); -Foo::$s = Foo::$i++; + +var_dump(Foo::$s); +var_dump(Foo::$s = Foo::$i++); var_dump(Foo::$s, Foo::$i); $a = 3; -Foo::$s = $a; +var_dump(Foo::$s = $a); var_dump(Foo::$s); -Foo::$i = "4"; +var_dump(Foo::$i = "4"); var_dump(Foo::$i); -Foo::$i = ref(); +var_dump(Foo::$i = ref()); var_dump(Foo::$i); -Foo::$s = ref(); +var_dump(Foo::$s = ref()); var_dump(Foo::$s); var_dump(ref()); ?> --EXPECT-- -string(1) "x" 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) From 3cdaf7187ba1e1a8af75da5c09ab3e0969222cfb Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 15:35:40 +0100 Subject: [PATCH 350/369] Remove unnecessary flag handling in compact_literals ASSIGN_* does not use obj flags. --- ext/opcache/Optimizer/compact_literals.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index 2df84c8539dc..397458365f96 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -566,17 +566,17 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx opline->op2.constant, opline->op1.constant, LITERAL_STATIC_PROPERTY, - &cache_size) | ((opline+1)->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + &cache_size); } else { - (opline+1)->extended_value = cache_size | ((opline+1)->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + (opline+1)->extended_value = cache_size; cache_size += 3 * sizeof(void *); } } else if (opline->op2_type == IS_CONST) { // op2 class if (class_slot[opline->op2.constant] >= 0) { - (opline+1)->extended_value = class_slot[opline->op2.constant] | ((opline+1)->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + (opline+1)->extended_value = class_slot[opline->op2.constant]; } else { - (opline+1)->extended_value = cache_size | ((opline+1)->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + (opline+1)->extended_value = cache_size; class_slot[opline->op2.constant] = cache_size; cache_size += sizeof(void *); } From eec91a2a51f7e756813dfcf2f7a56632aed8b6f7 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 15:37:29 +0100 Subject: [PATCH 351/369] Remove unnecessary result undefing This is handled by the calling code in this case. --- Zend/zend_execute.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index c387ce9eb8e5..9a6865e274e6 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -755,9 +755,6 @@ static zend_never_inline ZEND_COLD zval* ZEND_FASTCALL make_real_object_rw(zval zend_property_info *error_prop = i_zend_check_ref_stdClass_assignable(Z_REF_P(ref)); if (error_prop) { zend_throw_auto_init_in_ref_error(error_prop, "stdClass"); - if (RETURN_VALUE_USED(opline)) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); - } return NULL; } } From 4efefc3e2bf0e3ab4badef8df5d07d0c8ab9f27d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 15:43:49 +0100 Subject: [PATCH 352/369] Add ASSIGN_STATIC_PROP to opcodes that can have unused result --- ext/opcache/Optimizer/dce.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ext/opcache/Optimizer/dce.c b/ext/opcache/Optimizer/dce.c index 486334373a8b..95755d559ffb 100644 --- a/ext/opcache/Optimizer/dce.c +++ b/ext/opcache/Optimizer/dce.c @@ -328,9 +328,11 @@ static zend_bool try_remove_var_def(context *ctx, int free_var, int use_chain, z switch (def_opline->opcode) { case ZEND_ASSIGN: case ZEND_ASSIGN_REF: - case ZEND_ASSIGN_OBJ_REF: case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: + case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_STATIC_PROP_REF: case ZEND_ASSIGN_ADD: case ZEND_ASSIGN_SUB: case ZEND_ASSIGN_MUL: From f6257b74e05b0efd477afb13e8394606c20d30ab Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 16:26:04 +0100 Subject: [PATCH 353/369] Pack obj fetch flags tighter, so it's compatible with 32 bit --- Zend/zend_compile.h | 11 +++++------ Zend/zend_execute.c | 16 ++++++++-------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 0c7333425b8a..b872403e014f 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -898,12 +898,11 @@ void zend_assert_valid_class_name(const zend_string *const_name); #define ZEND_FETCH_TYPE_MASK 0xe -// TODO We only have 2 bits of flag space in the low bits, this won't work on -// 32-bit systems -#define ZEND_FETCH_REF (1<<0) -#define ZEND_FETCH_DIM_WRITE (1<<1) -#define ZEND_FETCH_OBJ_WRITE (1<<2) -#define ZEND_FETCH_OBJ_FLAGS (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_FETCH_OBJ_WRITE) +/* 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) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9a6865e274e6..3d94bfe00778 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2602,9 +2602,9 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c return_indirect: ZVAL_INDIRECT(result, ptr); if (flags && - (((flags & ZEND_FETCH_REF) && Z_TYPE_P(ptr) != IS_REFERENCE) || - ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(ptr)) || - ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(ptr))) + ((flags == ZEND_FETCH_REF && Z_TYPE_P(ptr) != IS_REFERENCE) || + (flags == ZEND_FETCH_DIM_WRITE && promotes_to_array(ptr)) || + (flags == ZEND_FETCH_OBJ_WRITE && promotes_to_object(ptr))) ) { zend_property_info *prop_info; @@ -2616,7 +2616,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { - if ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(ptr)) { + if (flags == ZEND_FETCH_DIM_WRITE && promotes_to_array(ptr)) { if (!check_type_array_assignable(prop_info->type)) { zend_throw_auto_init_in_prop_error(prop_info, "array"); ZVAL_UNDEF(ptr); @@ -2624,7 +2624,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } return; } - if ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(ptr)) { + if (flags == ZEND_FETCH_OBJ_WRITE && promotes_to_object(ptr)) { if (!check_type_stdClass_assignable(prop_info->type)) { zend_throw_auto_init_in_prop_error(prop_info, "stdClass"); ZVAL_UNDEF(ptr); @@ -2777,17 +2777,17 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } if (flags) { - if ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(*retval) + if (flags == ZEND_FETCH_DIM_WRITE && promotes_to_array(*retval) && !check_type_array_assignable(property_info->type)) { zend_throw_auto_init_in_prop_error(property_info, "array"); return FAILURE; } - if ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(*retval) + if (flags == ZEND_FETCH_OBJ_WRITE && promotes_to_object(*retval) && !check_type_stdClass_assignable(property_info->type)) { zend_throw_auto_init_in_prop_error(property_info, "stdClass"); return FAILURE; } - if ((flags & ZEND_FETCH_REF) && Z_TYPE_P(*retval) != IS_REFERENCE) { + if (flags == ZEND_FETCH_REF && Z_TYPE_P(*retval) != IS_REFERENCE) { zval *ref = *retval; if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(ref) <= IS_NULL)) { zend_throw_error(NULL, "Cannot access uninitialized property %s::$%s by reference", From f28943ca2e98730a408281a8781ed9f482bbeceb Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 17:16:21 +0100 Subject: [PATCH 354/369] Start working on inference support for typed static props Also fix a bug in inference for object properties: We must check that it's a non-static property, otherwise null becomes an additional valid return value. --- ext/opcache/Optimizer/zend_inference.c | 55 ++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 7d298d3ce386..3124c4f873ff 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -2280,10 +2280,9 @@ static uint32_t zend_fetch_arg_info(const zend_script *script, zend_arg_info *ar return tmp; } -static uint32_t zend_fetch_prop_type_info(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, int i, zend_class_entry **pce) +static zend_property_info *zend_fetch_prop_info(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, int i) { zend_property_info *prop_info = NULL; - if (opline->op2_type == IS_CONST) { zend_class_entry *ce = NULL; @@ -2295,9 +2294,52 @@ static uint32_t zend_fetch_prop_type_info(const zend_op_array *op_array, zend_ss if (ce) { prop_info = zend_hash_find_ptr(&ce->properties_info, Z_STR_P(CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants))); + if (prop_info && (prop_info->flags & ZEND_ACC_STATIC)) { + prop_info = NULL; + } + } + } + return prop_info; +} + +static zend_property_info *zend_fetch_static_prop_info(const zend_script *script, const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline) +{ + zend_property_info *prop_info = NULL; + if (opline->op1_type == IS_CONST) { + zend_class_entry *ce = NULL; + if (opline->op2_type == IS_UNUSED) { + int fetch_type = opline->op2.num & ZEND_FETCH_CLASS_MASK; + switch (fetch_type) { + case ZEND_FETCH_CLASS_SELF: + case ZEND_FETCH_CLASS_STATIC: + /* We enforce that static property types cannot change during inheritance, so + * handling static the same way as self here is legal. */ + ce = op_array->scope; + break; + case ZEND_FETCH_CLASS_PARENT: + if (op_array->scope) { + ce = op_array->scope->parent; + } + break; + } + } else if (opline->op2_type == IS_CONST) { + zval *zv = CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants); + ce = get_class_entry(script, Z_STR_P(zv + 1)); + } + + if (ce) { + zval *zv = CRT_CONSTANT_EX(op_array, opline, opline->op1, ssa->rt_constants); + prop_info = zend_hash_find_ptr(&ce->properties_info, Z_STR_P(zv)); + if (prop_info && !(prop_info->flags & ZEND_ACC_STATIC)) { + prop_info = NULL; + } } } + return prop_info; +} +static uint32_t zend_fetch_prop_type(zend_property_info *prop_info, zend_class_entry **pce) +{ if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { uint32_t type = ZEND_TYPE_IS_CLASS(prop_info->type) ? MAY_BE_OBJECT @@ -2314,7 +2356,6 @@ static uint32_t zend_fetch_prop_type_info(const zend_op_array *op_array, zend_ss } return type; } - if (pce) { *pce = NULL; } @@ -2523,7 +2564,7 @@ static int zend_update_type_info(const zend_op_array *op_array, tmp = 0; if (opline->extended_value == ZEND_ASSIGN_OBJ) { orig = t1; - t1 = zend_fetch_prop_type_info(op_array, ssa, opline, i, NULL); + t1 = zend_fetch_prop_type(zend_fetch_prop_info(op_array, ssa, opline, i), NULL); t2 = OP1_DATA_INFO(); } else if (opline->extended_value == ZEND_ASSIGN_DIM) { if (t1 & MAY_BE_ARRAY_OF_REF) { @@ -2595,7 +2636,7 @@ static int zend_update_type_info(const zend_op_array *op_array, } /* The return value must also satisfy the property type */ - t1 = zend_fetch_prop_type_info(op_array, ssa, opline, i, &ce); + t1 = zend_fetch_prop_type(zend_fetch_prop_info(op_array, ssa, opline, i), &ce); if (t1) { tmp &= t1; } @@ -2782,7 +2823,7 @@ static int zend_update_type_info(const zend_op_array *op_array, } if (ssa_ops[i].result_def >= 0) { // TODO: If there is no __set we might do better - tmp = zend_fetch_prop_type_info(op_array, ssa, opline, i, &ce); + tmp = zend_fetch_prop_type(zend_fetch_prop_info(op_array, ssa, opline, i), &ce); UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); if (ce) { UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); @@ -3436,7 +3477,7 @@ static int zend_update_type_info(const zend_op_array *op_array, COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); } if (ssa_ops[i].result_def >= 0) { - tmp = zend_fetch_prop_type_info(op_array, ssa, opline, i, &ce); + tmp = zend_fetch_prop_type(zend_fetch_prop_info(op_array, ssa, opline, i), &ce); if (opline->result_type != IS_TMP_VAR) { tmp |= MAY_BE_REF | MAY_BE_ERROR; } From 4910f1d274da580d1859c69af6ffadae51d6a891 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Jan 2019 15:09:49 +0100 Subject: [PATCH 355/369] Support type inference for static properties --- ext/opcache/Optimizer/zend_inference.c | 39 ++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 3124c4f873ff..58fb966171ff 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -2559,12 +2559,14 @@ static int zend_update_type_info(const zend_op_array *op_array, case ZEND_ASSIGN_BW_OR: case ZEND_ASSIGN_BW_AND: case ZEND_ASSIGN_BW_XOR: - case ZEND_ASSIGN_CONCAT: + case ZEND_ASSIGN_CONCAT: { + zend_property_info *prop_info = NULL; orig = 0; tmp = 0; if (opline->extended_value == ZEND_ASSIGN_OBJ) { + prop_info = zend_fetch_prop_info(op_array, ssa, opline, i); orig = t1; - t1 = zend_fetch_prop_type(zend_fetch_prop_info(op_array, ssa, opline, i), NULL); + t1 = zend_fetch_prop_type(prop_info, &ce); t2 = OP1_DATA_INFO(); } else if (opline->extended_value == ZEND_ASSIGN_DIM) { if (t1 & MAY_BE_ARRAY_OF_REF) { @@ -2573,6 +2575,10 @@ static int zend_update_type_info(const zend_op_array *op_array, orig = t1; t1 = zend_array_element_type(t1, 1, 0); t2 = OP1_DATA_INFO(); + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + prop_info = zend_fetch_static_prop_info(script, op_array, ssa, opline); + t1 = zend_fetch_prop_type(prop_info, &ce); + t2 = OP1_DATA_INFO(); } else { if (t1 & MAY_BE_REF) { tmp |= MAY_BE_REF; @@ -2608,6 +2614,8 @@ static int zend_update_type_info(const zend_op_array *op_array, UPDATE_SSA_TYPE(orig, ssa_ops[i].op1_def); COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); } + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + /* Nothing to do */ } else { UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); } @@ -2636,9 +2644,13 @@ static int zend_update_type_info(const zend_op_array *op_array, } /* The return value must also satisfy the property type */ - t1 = zend_fetch_prop_type(zend_fetch_prop_info(op_array, ssa, opline, i), &ce); - if (t1) { - tmp &= t1; + if (prop_info) { + tmp &= zend_fetch_prop_type(prop_info, NULL); + } + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + /* The return value must also satisfy the property type */ + if (prop_info) { + tmp &= zend_fetch_prop_type(prop_info, NULL); } } tmp &= ~MAY_BE_REF; @@ -2648,6 +2660,7 @@ static int zend_update_type_info(const zend_op_array *op_array, } } break; + } case ZEND_PRE_INC: case ZEND_PRE_DEC: tmp = 0; @@ -3487,6 +3500,22 @@ static int zend_update_type_info(const zend_op_array *op_array, } } break; + case ZEND_FETCH_STATIC_PROP_R: + case ZEND_FETCH_STATIC_PROP_IS: + case ZEND_FETCH_STATIC_PROP_RW: + case ZEND_FETCH_STATIC_PROP_W: + case ZEND_FETCH_STATIC_PROP_UNSET: + case ZEND_FETCH_STATIC_PROP_FUNC_ARG: + tmp = zend_fetch_prop_type( + zend_fetch_static_prop_info(script, op_array, ssa, opline), &ce); + if (opline->result_type != IS_TMP_VAR) { + tmp |= MAY_BE_REF | MAY_BE_ERROR; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); + if (ce) { + UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); + } + break; case ZEND_DO_FCALL: case ZEND_DO_ICALL: case ZEND_DO_UCALL: From 78acbd7b2ed470ca23b915db8aebca54ab8c5e74 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Jan 2019 15:26:17 +0100 Subject: [PATCH 356/369] Don't call magic in ReflectionProperty::isInitialized() --- ext/reflection/php_reflection.c | 16 +++++++----- .../ReflectionProperty_isInitialized.phpt | 26 +++++++++++++++++++ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index b59f9fd69460..126283a9c0fa 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -5507,7 +5507,9 @@ ZEND_METHOD(reflection_property, isInitialized) } RETURN_FALSE; } else { - zval rv; + zval name_zv; + zend_class_entry *old_scope; + int retval; if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &object) == FAILURE) { return; @@ -5518,11 +5520,13 @@ ZEND_METHOD(reflection_property, isInitialized) /* Returns from this function */ } - member_p = zend_read_property_ex(intern->ce, object, ref->unmangled_name, 1, &rv); - RETVAL_BOOL(member_p != &EG(uninitialized_zval)); - if (member_p == &rv) { - zval_ptr_dtor(member_p); - } + old_scope = EG(fake_scope); + EG(fake_scope) = intern->ce; + ZVAL_STR(&name_zv, ref->unmangled_name); + retval = Z_OBJ_HT_P(object)->has_property(object, &name_zv, ZEND_PROPERTY_EXISTS, NULL); + EG(fake_scope) = old_scope; + + RETVAL_BOOL(retval); } } /* }}} */ diff --git a/ext/reflection/tests/ReflectionProperty_isInitialized.phpt b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt index 587919605dc7..f1f6e53ebd54 100644 --- a/ext/reflection/tests/ReflectionProperty_isInitialized.phpt +++ b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt @@ -62,6 +62,29 @@ try { echo $e->getMessage(), "\n"; } +class WithMagic { + public $prop; + public int $intProp; + + public function __isset($name) { + echo "__isset($name)\n"; + return true; + } + + public function __get($name) { + echo "__get($name)\n"; + return "foobar"; + } +} + +echo "Class with __isset:\n"; +$obj = new WithMagic; +unset($obj->prop); +$rp = new ReflectionProperty('WithMagic', 'prop'); +var_dump($rp->isInitialized($obj)); +$rp = new ReflectionProperty('WithMagic', 'intProp'); +var_dump($rp->isInitialized($obj)); + ?> --EXPECT-- Static properties: @@ -85,3 +108,6 @@ bool(false) Object type: bool(false) Given object is not an instance of the class this property was declared in +Class with __isset: +bool(false) +bool(false) From 743011509e198033b6413f3b1fd080230c29fc26 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Jan 2019 15:31:46 +0100 Subject: [PATCH 357/369] Remove redundant check in zend_inheritance --- Zend/zend_inheritance.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index fec9c1234327..dd15d5aab539 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -746,7 +746,7 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke } if (UNEXPECTED(ZEND_TYPE_IS_SET(parent_info->type))) { - if (ZEND_TYPE_IS_CLASS(parent_info->type) ? !property_types_compatible(parent_info, child_info) : parent_info->type != child_info->type) { + if (!property_types_compatible(parent_info, child_info)) { zend_error_noreturn(E_COMPILE_ERROR, "Type of %s::$%s must be %s%s (as in class %s)", ZSTR_VAL(ce->name), From c5d916ff4c77af5ae22fca72e4004a19b0d6a089 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Jan 2019 15:36:13 +0100 Subject: [PATCH 358/369] Remove dead code --- ext/opcache/Optimizer/zend_optimizer.c | 1 - 1 file changed, 1 deletion(-) diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 0e18a2dd91c0..912f635c7fc4 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -535,7 +535,6 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, (opline+1)->extended_value = alloc_cache_slots(op_array, 3); } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { goto handle_static_prop; - (opline+1)->extended_value = alloc_cache_slots(op_array, 2); } else if (opline->extended_value == ZEND_ASSIGN_DIM) { if (Z_TYPE_P(val) == IS_STRING) { zend_ulong index; From 8b714421246267f939cfc9ffe431f03ac8470785 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Jan 2019 15:37:51 +0100 Subject: [PATCH 359/369] Convert if/else to switch Based on reviewer comment. --- ext/opcache/Optimizer/zend_inference.c | 28 +++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 58fb966171ff..b5227feffaa2 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -2241,21 +2241,21 @@ static inline zend_class_entry *get_class_entry(const zend_script *script, zend_ } static uint32_t zend_convert_type_code_to_may_be(zend_uchar type_code) { - if (type_code == IS_VOID) { - return MAY_BE_NULL; - } else if (type_code == IS_CALLABLE) { - return MAY_BE_STRING|MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; - } else if (type_code == IS_ITERABLE) { - return MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; - } else if (type_code == IS_ARRAY) { - return MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; - } else if (type_code == _IS_BOOL) { - return MAY_BE_TRUE|MAY_BE_FALSE; + switch (type_code) { + case IS_VOID: + return MAY_BE_NULL; + case IS_CALLABLE: + return MAY_BE_STRING|MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; + case IS_ITERABLE: + return MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; + case IS_ARRAY: + return MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; + case _IS_BOOL: + return MAY_BE_TRUE|MAY_BE_FALSE; + default: + ZEND_ASSERT(type_code < IS_REFERENCE); + return 1 << type_code; } - - ZEND_ASSERT(type_code < IS_REFERENCE); - return 1 << type_code; - } static uint32_t zend_fetch_arg_info(const zend_script *script, zend_arg_info *arg_info, zend_class_entry **pce) From 401ff4ce052c75839ccdc20be7c46e276c87470a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Jan 2019 15:39:21 +0100 Subject: [PATCH 360/369] Revert "Remove lchown($file, -5); test" This reverts commit 0cc95b84d5d31f33ee5080116dca0f81d501cdac. This has already been fixed in a different way in 3b830cfb5c87974eb48596cdc4e4bf07cab89acc and is unrelated to typed properties... --- ext/standard/tests/file/lchown_error.phpt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ext/standard/tests/file/lchown_error.phpt b/ext/standard/tests/file/lchown_error.phpt index 7564042fdfe8..f4b4f5089e2d 100644 --- a/ext/standard/tests/file/lchown_error.phpt +++ b/ext/standard/tests/file/lchown_error.phpt @@ -43,6 +43,9 @@ var_dump( lchown( 'foobar_lchown.txt', $uid ) ); var_dump( lchown( new StdClass(), $uid ) ); var_dump( lchown( array(), $uid ) ); +// Bad user +var_dump( lchown( $filename, -5 ) ); + ?> ===DONE=== --CLEAN-- @@ -69,4 +72,7 @@ bool(true) Warning: lchown() expects parameter 1 to be a valid path, array given in %s on line %d bool(true) + +Warning: lchown(): %r(Operation not permitted|Invalid argument)%r in %s on line %d +bool(false) ===DONE=== From dbf7d8202f59f6014995e22060bff4acabe8dcf8 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Jan 2019 16:11:39 +0100 Subject: [PATCH 361/369] Allow references to typed properties during unserialization Still needs more work to make the assignment successful in more cases. --- .../tests/serialize/typed_property_refs.phpt | 25 +++++++++++- ext/standard/var_unserializer.re | 40 ++++++++++++------- 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/ext/standard/tests/serialize/typed_property_refs.phpt b/ext/standard/tests/serialize/typed_property_refs.phpt index a05a8e53af51..a58bd3e10848 100644 --- a/ext/standard/tests/serialize/typed_property_refs.phpt +++ b/ext/standard/tests/serialize/typed_property_refs.phpt @@ -13,17 +13,38 @@ class B { public int $b; } +class C { + public int $a; + public string $b; +} + var_dump(unserialize('O:1:"A":2:{s:1:"a";i:1;s:1:"b";R:2;}')); var_dump(unserialize('O:1:"B":2:{s:1:"a";i:1;s:1:"b";R:2;}')); +var_dump(unserialize('O:1:"A":2:{s:1:"a";N;s:1:"b";R:2;}')); +var_dump(unserialize('O:1:"B":2:{s:1:"a";N;s:1:"b";R:2;}')); +var_dump(unserialize('O:1:"C":2:{s:1:"a";i:1;s:1:"b";R:2;}')); +var_dump(unserialize('O:1:"C":2:{s:1:"b";s:1:"x";s:1:"a";R:2;}')); ?> --EXPECTF-- object(A)#1 (2) { ["a"]=> - int(1) + &int(1) ["b"]=> - int(1) + &int(1) } Notice: unserialize(): Error at offset 35 of 36 bytes in %s on line %d bool(false) + +Notice: unserialize(): Error at offset 21 of 34 bytes in %s on line %d +bool(false) + +Notice: unserialize(): Error at offset 33 of 34 bytes in %s on line %d +bool(false) + +Notice: unserialize(): Error at offset 35 of 36 bytes in %s on line %d +bool(false) + +Notice: unserialize(): Error at offset 39 of 40 bytes in %s on line %d +bool(false) diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index ad80d4b1ce7f..b1b14eb6a3fb 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -46,7 +46,7 @@ struct php_unserialize_data { var_dtor_entries *first_dtor; var_dtor_entries *last_dtor; HashTable *allowed_classes; - HashTable *refs; + HashTable *ref_props; var_entries entries; }; @@ -58,7 +58,7 @@ PHPAPI php_unserialize_data_t php_var_unserialize_init() { d->last = &d->entries; d->first_dtor = d->last_dtor = NULL; d->allowed_classes = NULL; - d->refs = NULL; + d->ref_props = NULL; d->entries.used_slots = 0; d->entries.next = NULL; if (!BG(serialize_lock)) { @@ -242,8 +242,8 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx) zval_ptr_dtor_nogc(&wakeup_name); - if ((*var_hashx)->refs) { - zend_array_destroy((*var_hashx)->refs); + if ((*var_hashx)->ref_props) { + zend_array_destroy((*var_hashx)->ref_props); } } @@ -497,6 +497,7 @@ string_key: if ((old_data = zend_hash_find(ht, Z_STR(key))) != NULL) { if (Z_TYPE_P(old_data) == IS_INDIRECT) { + // TODO Deduplicate with above code? old_data = Z_INDIRECT_P(old_data); if (Z_STRVAL(key)[0] == 0) { zend_string *member, *class; @@ -515,18 +516,19 @@ string_key: info = zend_get_property_info(ce, Z_STR(key), 1); } var_push_dtor(var_hash, old_data); - old_data = zend_hash_update_ind(ht, Z_STR(key), &d); + data = zend_hash_update_ind(ht, Z_STR(key), &d); if (EXPECTED(!info->type)) { info = NULL; - data = old_data; } else { - /* little hack to disallow references */ - if (!(*var_hash)->refs) { - (*var_hash)->refs = emalloc(sizeof(HashTable)); - zend_hash_init((*var_hash)->refs, 8, NULL, ZVAL_PTR_DTOR, 0); + /* Remember to which property this slot belongs, so we can add a type + * source if it is turned into a reference lateron. */ + if (!(*var_hash)->ref_props) { + (*var_hash)->ref_props = emalloc(sizeof(HashTable)); + zend_hash_init((*var_hash)->ref_props, 8, NULL, NULL, 0); } - data = zend_hash_next_index_insert((*var_hash)->refs, &d); + zend_hash_index_update_ptr( + (*var_hash)->ref_props, (zend_uintptr_t) data, info); } } else { var_push_dtor(var_hash, old_data); @@ -551,6 +553,8 @@ string_key: } if (UNEXPECTED(info)) { + // TODO Throw an error instead? + // TODO Handle references correctly ZVAL_COPY_VALUE(&tmp, data); if (UNEXPECTED(!zend_verify_property_type(info, &tmp, 1))) { zval_dtor(&key); @@ -745,13 +749,19 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) return 0; } - if (Z_ISREF_P(rval_ref)) { - ZVAL_COPY(rval, rval_ref); - } else { + if (!Z_ISREF_P(rval_ref)) { + zend_property_info *info = NULL; + if ((*var_hash)->ref_props) { + info = zend_hash_index_find_ptr((*var_hash)->ref_props, (zend_uintptr_t) rval_ref); + } ZVAL_NEW_REF(rval_ref, rval_ref); - ZVAL_COPY(rval, rval_ref); + if (info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(rval_ref), info); + } } + ZVAL_COPY(rval, rval_ref); + return 1; } From b1df1b71d0f1f3214433da0345efa63ef4fc2489 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Jan 2019 16:38:29 +0100 Subject: [PATCH 362/369] Fix type checks during unserialization --- .../tests/serialize/typed_property_refs.phpt | 63 +++++++++++++------ ext/standard/var_unserializer.re | 14 ++--- 2 files changed, 50 insertions(+), 27 deletions(-) diff --git a/ext/standard/tests/serialize/typed_property_refs.phpt b/ext/standard/tests/serialize/typed_property_refs.phpt index a58bd3e10848..9475e8a78339 100644 --- a/ext/standard/tests/serialize/typed_property_refs.phpt +++ b/ext/standard/tests/serialize/typed_property_refs.phpt @@ -18,33 +18,56 @@ class C { public string $b; } +class D { + public int $a; + public float $b; +} + var_dump(unserialize('O:1:"A":2:{s:1:"a";i:1;s:1:"b";R:2;}')); var_dump(unserialize('O:1:"B":2:{s:1:"a";i:1;s:1:"b";R:2;}')); -var_dump(unserialize('O:1:"A":2:{s:1:"a";N;s:1:"b";R:2;}')); -var_dump(unserialize('O:1:"B":2:{s:1:"a";N;s:1:"b";R:2;}')); -var_dump(unserialize('O:1:"C":2:{s:1:"a";i:1;s:1:"b";R:2;}')); -var_dump(unserialize('O:1:"C":2:{s:1:"b";s:1:"x";s:1:"a";R:2;}')); + +try { + var_dump(unserialize('O:1:"A":2:{s:1:"a";N;s:1:"b";R:2;}')); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +try { + var_dump(unserialize('O:1:"B":2:{s:1:"a";N;s:1:"b";R:2;}')); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +try { + var_dump(unserialize('O:1:"C":2:{s:1:"a";i:1;s:1:"b";R:2;}')); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +try { + var_dump(unserialize('O:1:"C":2:{s:1:"b";s:1:"x";s:1:"a";R:2;}')); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +try { + var_dump(unserialize('O:1:"D":2:{s:1:"a";i:1;s:1:"b";R:2;}')); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} ?> ---EXPECTF-- +--EXPECT-- object(A)#1 (2) { ["a"]=> &int(1) ["b"]=> &int(1) } - -Notice: unserialize(): Error at offset 35 of 36 bytes in %s on line %d -bool(false) - -Notice: unserialize(): Error at offset 21 of 34 bytes in %s on line %d -bool(false) - -Notice: unserialize(): Error at offset 33 of 34 bytes in %s on line %d -bool(false) - -Notice: unserialize(): Error at offset 35 of 36 bytes in %s on line %d -bool(false) - -Notice: unserialize(): Error at offset 39 of 40 bytes in %s on line %d -bool(false) +object(B)#1 (2) { + ["a"]=> + &int(1) + ["b"]=> + &int(1) +} +Typed property A::$a must be int, null used +Typed property B::$b must be int, null used +Typed property C::$b must be string, int used +Typed property C::$a must be int, string used +Reference with value of type int held by property D::$a of type int is not compatible with property D::$b of type float diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index b1b14eb6a3fb..f3901bb58aa1 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -404,7 +404,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key); static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, zend_long elements, zend_class_entry *ce) { while (elements-- > 0) { - zval key, *data, d, *old_data, tmp; + zval key, *data, d, *old_data; zend_ulong idx; zend_property_info *info = NULL; @@ -553,15 +553,15 @@ string_key: } if (UNEXPECTED(info)) { - // TODO Throw an error instead? - // TODO Handle references correctly - ZVAL_COPY_VALUE(&tmp, data); - if (UNEXPECTED(!zend_verify_property_type(info, &tmp, 1))) { + if (!zend_verify_prop_assignable_by_ref(info, data, /* strict */ 1)) { + zval_ptr_dtor(data); + ZVAL_UNDEF(data); zval_dtor(&key); return 0; } - data = &tmp; - ZVAL_COPY(old_data, data); + if (Z_ISREF_P(data)) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(data), info); + } } if (BG(unserialize).level > 1) { From bac542502582ed57426c21928c6447c894ab78d5 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 7 Jan 2019 10:47:16 +0100 Subject: [PATCH 363/369] Correctly handle refs on ASSIGN_OBJ fastpath --- .../typed_properties_092.phpt | 41 + Zend/zend_vm_def.h | 46 +- Zend/zend_vm_execute.h | 1656 ++++++++++------- 3 files changed, 1077 insertions(+), 666 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_092.phpt 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 000000000000..8509fa74464c --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_092.phpt @@ -0,0 +1,41 @@ +--TEST-- +Refs on ASSIGN_OBJ fast-path +--FILE-- +prop = $array; + } + + public function bar() { + $str = "123"; + $this->prop2 = ref($str); + } +} + +$test = new Test; +$test->foo(); +$test->foo(); +$test->bar(); +$test->bar(); +var_dump($test); + +?> +--EXPECT-- +object(Test)#1 (2) { + ["prop"]=> + array(0) { + } + ["prop2"]=> + int(123) +} diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 0c94db72c578..fb2e6c3021a4 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2331,23 +2331,43 @@ ZEND_VM_C_LABEL(assign_object): zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((OP_DATA_TYPE & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((OP_DATA_TYPE & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - FREE_OP_DATA(); + zval_ptr_dtor(value); + if ((OP_DATA_TYPE & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } FREE_OP2(); FREE_OP1_VAR_PTR(); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (OP_DATA_TYPE == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((OP_DATA_TYPE & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { ZEND_VM_C_LABEL(fast_assign_obj): - value = zend_assign_to_variable(property_val, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); + 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); } @@ -2427,11 +2447,8 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if !defined(ZEND_VM_SPEC) || !(OP_DATA_TYPE & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -2444,22 +2461,17 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); if (UNEXPECTED(prop_info->type)) { -#if defined(ZEND_VM_SPEC) && (OP_DATA_TYPE & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if !defined(ZEND_VM_SPEC) || (OP_DATA_TYPE & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((OP_DATA_TYPE & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((OP_DATA_TYPE & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((OP_DATA_TYPE & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((OP_DATA_TYPE & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -2468,13 +2480,11 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if !defined(ZEND_VM_SPEC) || !(OP_DATA_TYPE & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((OP_DATA_TYPE & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index c6a39f4b6b57..9e666e43776c 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4984,11 +4984,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -5001,22 +4998,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -5025,13 +5017,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -5051,11 +5041,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -5068,22 +5055,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -5092,13 +5074,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -5118,11 +5098,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -5135,22 +5112,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -5159,13 +5131,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -5185,11 +5155,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -5202,22 +5169,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -5226,13 +5188,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -8571,11 +8531,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -8588,22 +8545,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -8612,13 +8564,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -8638,11 +8588,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -8655,22 +8602,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -8679,13 +8621,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -8705,11 +8645,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -8722,22 +8659,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -8746,13 +8678,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -8772,11 +8702,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -8789,22 +8716,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -8813,13 +8735,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -9503,11 +9423,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -9520,22 +9437,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -9544,13 +9456,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -9570,11 +9480,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -9587,22 +9494,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -9611,13 +9513,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -9637,11 +9537,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -9654,22 +9551,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -9678,13 +9570,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -9704,11 +9594,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -9721,22 +9608,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -9745,13 +9627,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -15080,11 +14960,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -15097,22 +14974,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -15121,13 +14993,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -15147,11 +15017,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -15164,22 +15031,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -15188,13 +15050,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -15214,11 +15074,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -15231,22 +15088,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -15255,13 +15107,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -15281,11 +15131,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -15298,22 +15145,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -15322,13 +15164,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -17542,11 +17382,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -17559,22 +17396,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -17583,13 +17415,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -17609,11 +17439,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -17626,22 +17453,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -17650,13 +17472,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -17676,11 +17496,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -17693,22 +17510,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -17717,13 +17529,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -17743,11 +17553,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -17760,22 +17567,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -17784,13 +17586,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -18220,11 +18020,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -18237,22 +18034,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -18261,13 +18053,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -18287,11 +18077,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -18304,22 +18091,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -18328,13 +18110,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -18354,11 +18134,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -18371,22 +18148,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -18395,13 +18167,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -18421,11 +18191,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -18438,22 +18205,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -18462,13 +18224,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -25609,23 +25369,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + 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); } @@ -25743,23 +25523,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -25877,23 +25677,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -26011,23 +25831,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + 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); } @@ -28499,23 +28339,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + 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); } @@ -28633,23 +28493,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -28767,23 +28647,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -28901,23 +28801,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + 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); } @@ -32982,23 +32902,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + 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); } @@ -33116,23 +33056,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -33250,23 +33210,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -33384,23 +33364,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + 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); } @@ -35689,23 +35689,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } - + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + 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); } @@ -35823,23 +35843,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -35957,23 +35997,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -36091,23 +36151,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } - + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + 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); } @@ -37674,23 +37754,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + 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); } @@ -37808,23 +37908,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -37942,23 +38062,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -38076,23 +38216,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + 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); } @@ -40306,23 +40466,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } - + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + 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); } @@ -40440,23 +40620,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -40574,23 +40774,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -40708,23 +40928,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } - + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + 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); } @@ -45402,23 +45642,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } - + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + 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); } @@ -45536,23 +45796,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -45670,23 +45950,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -45804,23 +46104,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } - + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + 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); } @@ -45900,11 +46220,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -45917,22 +46234,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -45941,13 +46253,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -45967,11 +46277,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -45984,22 +46291,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -46008,13 +46310,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -46034,11 +46334,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -46051,22 +46348,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -46075,13 +46367,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -46101,11 +46391,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -46118,22 +46405,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -46142,13 +46424,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -49973,23 +50253,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + 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); } @@ -50107,23 +50407,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -50241,23 +50561,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -50375,23 +50715,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + 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); } @@ -52161,11 +52521,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -52178,22 +52535,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -52202,13 +52554,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -52228,11 +52578,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -52245,22 +52592,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -52269,13 +52611,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -52295,11 +52635,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -52312,22 +52649,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -52336,13 +52668,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -52362,11 +52692,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -52379,22 +52706,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -52403,13 +52725,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -53488,11 +53808,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -53505,22 +53822,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -53529,13 +53841,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -53555,11 +53865,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -53572,22 +53879,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -53596,13 +53898,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -53622,11 +53922,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -53639,22 +53936,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -53663,13 +53955,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -53689,11 +53979,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -53706,22 +53993,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -53730,13 +54012,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -56837,23 +57117,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } - + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + 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); } @@ -56971,23 +57271,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -57105,23 +57425,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + 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); } @@ -57239,23 +57579,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } - + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + 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); } From 882aabab2c07fb5058e0d5122234c7a800f0bb71 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 7 Jan 2019 11:19:28 +0100 Subject: [PATCH 364/369] Handle ASSIGN_STATIC_PROP compound assign in SCCP --- ext/opcache/Optimizer/sccp.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ext/opcache/Optimizer/sccp.c b/ext/opcache/Optimizer/sccp.c index 48d513030bce..c7251f70811a 100644 --- a/ext/opcache/Optimizer/sccp.c +++ b/ext/opcache/Optimizer/sccp.c @@ -1400,7 +1400,7 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o if (op2) { SKIP_IF_TOP(op2); } - if (!opline->extended_value) { + if (opline->extended_value == 0) { if (zend_optimizer_eval_binary_op(&zv, zend_compound_assign_to_binary_op(opline->opcode), op1, op2) == SUCCESS) { SET_RESULT(op1, &zv); SET_RESULT(result, &zv); @@ -1482,6 +1482,11 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o zval_ptr_dtor_nogc(&zv); } } + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + SET_RESULT_BOT(result); + break; + } else { + ZEND_ASSERT(0 && "Invalid compound assignment kind"); } SET_RESULT_BOT(result); SET_RESULT_BOT(op1); From 978834415b424e2de9aee4fa1c9d8210d759ecf1 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 7 Jan 2019 11:33:41 +0100 Subject: [PATCH 365/369] Remove bogus check in ASSIGN_OBJ_REF --- Zend/zend_vm_def.h | 34 ++- Zend/zend_vm_execute.h | 546 +++++++++++++++++++---------------------- 2 files changed, 271 insertions(+), 309 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index fb2e6c3021a4..3592d587ce3d 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2756,26 +2756,24 @@ ZEND_VM_HANDLER(200, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C } else { zend_property_info *prop_info = NULL; - if ((OP2_TYPE == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (OP2_TYPE == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (OP2_TYPE == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - FREE_OP1_VAR_PTR(); - FREE_OP2(); - FREE_OP_DATA_VAR_PTR(); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_OP_DATA_VAR_PTR(); + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 9e666e43776c..22962ad3eb99 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -26536,26 +26536,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } else { zend_property_info *prop_info = NULL; - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -26634,26 +26632,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } else { zend_property_info *prop_info = NULL; - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -29450,26 +29446,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } else { zend_property_info *prop_info = NULL; - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -29548,26 +29542,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } else { zend_property_info *prop_info = NULL; - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -34117,26 +34109,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } else { zend_property_info *prop_info = NULL; - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -34215,26 +34205,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } else { zend_property_info *prop_info = NULL; - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -36322,26 +36310,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } else { zend_property_info *prop_info = NULL; - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -36419,26 +36405,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } else { zend_property_info *prop_info = NULL; - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -38387,26 +38371,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } else { zend_property_info *prop_info = NULL; - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -38484,26 +38466,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } else { zend_property_info *prop_info = NULL; - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -41099,26 +41079,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } else { zend_property_info *prop_info = NULL; - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -41196,26 +41174,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } else { zend_property_info *prop_info = NULL; - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -47037,26 +47013,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } else { zend_property_info *prop_info = NULL; - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -47134,26 +47108,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } else { zend_property_info *prop_info = NULL; - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -51364,26 +51336,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } else { zend_property_info *prop_info = NULL; - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -51461,26 +51431,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } else { zend_property_info *prop_info = NULL; - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -58332,26 +58300,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } else { zend_property_info *prop_info = NULL; - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -58429,26 +58395,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } else { zend_property_info *prop_info = NULL; - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); From c89b5ba656e5acbeac1909365027f0b4e5fd779e Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 7 Jan 2019 11:54:07 +0100 Subject: [PATCH 366/369] Add slot to prop info mapping mechanism Taken from PR #3573, minus the foreach/iteration parts. --- Zend/zend.h | 2 ++ Zend/zend_API.c | 11 +++++++ Zend/zend_compile.c | 3 ++ Zend/zend_inheritance.c | 38 +++++++++++++++++++++++ Zend/zend_inheritance.h | 1 + Zend/zend_object_handlers.h | 8 +++++ Zend/zend_opcode.c | 3 ++ ext/opcache/zend_accelerator_util_funcs.c | 10 ++++++ ext/opcache/zend_file_cache.c | 22 +++++++++++++ ext/opcache/zend_persist.c | 13 ++++++++ ext/opcache/zend_persist_calc.c | 4 +++ 11 files changed, 115 insertions(+) diff --git a/Zend/zend.h b/Zend/zend.h index aadda0c3cc87..5918691c279b 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -133,6 +133,8 @@ struct _zend_class_entry { HashTable properties_info; HashTable constants_table; + struct _zend_property_info **properties_info_table; + zend_function *constructor; zend_function *destructor; zend_function *clone; diff --git a/Zend/zend_API.c b/Zend/zend_API.c index f5a957acad30..1e9c163277f2 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2658,6 +2658,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; } @@ -3632,10 +3633,20 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name 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); } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index d27106cea0d5..64a879eaef6d 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1613,6 +1613,7 @@ ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify ce->default_properties_count = 0; ce->default_static_members_count = 0; + ce->properties_info_table = NULL; if (nullify_handlers) { ce->constructor = NULL; @@ -6495,6 +6496,7 @@ void zend_compile_class_decl(zend_ast *ast, zend_bool toplevel) /* {{{ */ CG(zend_lineno) = decl->end_lineno; ce->ce_flags |= ZEND_ACC_LINKED; zend_do_inheritance(ce, parent_ce); + zend_build_properties_info_table(ce); if ((ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) == ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) { zend_verify_abstract_class(ce); } @@ -6506,6 +6508,7 @@ void zend_compile_class_decl(zend_ast *ast, zend_bool toplevel) /* {{{ */ } else { if (EXPECTED(zend_hash_add_ptr(CG(class_table), lcname, ce) != NULL)) { zend_string_release(lcname); + zend_build_properties_info_table(ce); ce->ce_flags |= ZEND_ACC_LINKED; return; } diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index dd15d5aab539..4fdf04e9fa5a 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -846,6 +846,42 @@ static void do_inherit_class_constant(zend_string *name, zend_class_constant *pa } /* }}} */ +void zend_build_properties_info_table(zend_class_entry *ce) +{ + zend_property_info **table, *prop; + if (ce->default_properties_count == 0) { + return; + } + + ZEND_ASSERT(ce->properties_info_table == NULL); + if (ce->type == ZEND_USER_CLASS) { + ce->properties_info_table = table = zend_arena_alloc(&CG(arena), + sizeof(zend_property_info *) * ce->default_properties_count); + } else { + ce->properties_info_table = table = pemalloc( + sizeof(zend_property_info *) * ce->default_properties_count, 1); + } + + if (ce->parent && ce->parent->default_properties_count != 0) { + zend_property_info **parent_table = ce->parent->properties_info_table; + memcpy( + table, parent_table, + sizeof(zend_property_info *) * ce->parent->default_properties_count + ); + + /* Child did not add any new properties, we are done */ + if (ce->default_properties_count == ce->parent->default_properties_count) { + return; + } + } + + ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) { + if (prop->ce == ce && (prop->flags & ZEND_ACC_STATIC) == 0) { + table[OBJ_PROP_TO_NUM(prop->offset)] = prop; + } + } ZEND_HASH_FOREACH_END(); +} + ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent_ce) /* {{{ */ { zend_property_info *property_info; @@ -2003,6 +2039,8 @@ ZEND_API void zend_do_link_class(zend_class_entry *ce, zend_class_entry *parent) if ((ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) == ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) { zend_verify_abstract_class(ce); } + + zend_build_properties_info_table(ce); } /* }}} */ diff --git a/Zend/zend_inheritance.h b/Zend/zend_inheritance.h index 9df49cb07e79..f53b9f7d2441 100644 --- a/Zend/zend_inheritance.h +++ b/Zend/zend_inheritance.h @@ -31,6 +31,7 @@ ZEND_API void zend_do_link_class(zend_class_entry *ce, zend_class_entry *parent_ void zend_verify_abstract_class(zend_class_entry *ce); void zend_check_deprecated_constructor(const zend_class_entry *ce); +void zend_build_properties_info_table(zend_class_entry *ce); zend_string* zend_resolve_property_type(zend_string *name, zend_class_entry *scope); diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index c3b5fda42dda..b306d67eb8e8 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -246,6 +246,14 @@ ZEND_API HashTable *zend_get_properties_for(zval *obj, zend_prop_purpose purpose } \ } while (0) +static inline struct _zend_property_info *zend_get_property_info_for_slot(zend_object *obj, zval *slot) +{ + struct _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]; +} + #define zend_free_trampoline(func) do { \ if ((func) == &EG(trampoline)) { \ EG(trampoline).common.function_name = NULL; \ diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index c38ea0855c7e..2580824a6c70 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -374,6 +374,9 @@ ZEND_API void destroy_zend_class(zval *zv) if (ce->num_interfaces > 0) { free(ce->interfaces); } + if (ce->properties_info_table) { + free(ce->properties_info_table); + } free(ce); break; } diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index caf160a152bb..7b04d0d2df44 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -312,6 +312,16 @@ static void zend_class_copy_ctor(zend_class_entry **pce) /* constants table */ zend_hash_clone_constants(&ce->constants_table); + if (ce->properties_info_table) { + int i; + ce->properties_info_table = ARENA_REALLOC(ce->properties_info_table); + for (i = 0; i < ce->default_properties_count; i++) { + if (IN_ARENA(ce->properties_info_table[i])) { + ce->properties_info_table[i] = ARENA_REALLOC(ce->properties_info_table[i]); + } + } + } + if (ce->num_interfaces) { zend_class_name *interface_names; diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index fddcd5dcd4c7..bebb753122bb 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -660,6 +660,19 @@ static void zend_file_cache_serialize_class(zval *zv, SERIALIZE_STR(ce->info.user.doc_comment); zend_file_cache_serialize_hash(&ce->properties_info, script, info, buf, zend_file_cache_serialize_prop_info); + if (ce->properties_info_table) { + uint32_t i; + zend_property_info **table; + + SERIALIZE_PTR(ce->properties_info_table); + table = ce->properties_info_table; + UNSERIALIZE_PTR(table); + + for (i = 0; i < ce->default_properties_count; i++) { + SERIALIZE_PTR(table[i]); + } + } + if (ce->num_interfaces) { uint32_t i; zend_class_name *interface_names; @@ -1325,6 +1338,15 @@ static void zend_file_cache_unserialize_class(zval *zv, zend_file_cache_unserialize_hash(&ce->properties_info, script, buf, zend_file_cache_unserialize_prop_info, NULL); + if (ce->properties_info_table) { + uint32_t i; + UNSERIALIZE_PTR(ce->properties_info_table); + + for (i = 0; i < ce->default_properties_count; i++) { + UNSERIALIZE_PTR(ce->properties_info_table[i]); + } + } + if (ce->num_interfaces) { uint32_t i; diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index 108b68a2e5fb..71cc452ff5d9 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -872,6 +872,19 @@ static void zend_persist_class_entry(zval *zv) zend_hash_persist(&ce->properties_info, zend_persist_property_info); HT_FLAGS(&ce->properties_info) &= (HASH_FLAG_UNINITIALIZED | HASH_FLAG_STATIC_KEYS); + if (ce->properties_info_table) { + int i; + + size_t size = sizeof(zend_property_info *) * ce->default_properties_count; + memcpy(ZCG(arena_mem), ce->properties_info_table, size); + ce->properties_info_table = ZCG(arena_mem); + ZCG(arena_mem) = (void*)((char*)ZCG(arena_mem) + ZEND_ALIGNED_SIZE(size)); + + for (i = 0; i < ce->default_properties_count; i++) { + ce->properties_info_table[i] = zend_shared_alloc_get_xlat_entry(ce->properties_info_table[i]); + } + } + if (ce->num_interfaces && !(ce->ce_flags & ZEND_ACC_LINKED)) { uint32_t i = 0; diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c index 3761e9bf6505..a17d7c4627f6 100644 --- a/ext/opcache/zend_persist_calc.c +++ b/ext/opcache/zend_persist_calc.c @@ -387,6 +387,10 @@ static void zend_persist_class_entry_calc(zval *zv) zend_hash_persist_calc(&ce->properties_info, zend_persist_property_info_calc); + if (ce->properties_info_table) { + ADD_ARENA_SIZE(sizeof(zend_property_info *) * ce->default_properties_count); + } + if (ce->num_interfaces) { uint32_t i; From 40540b71b9b70373d334ef4dda9bed21060fe43e Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 7 Jan 2019 12:12:14 +0100 Subject: [PATCH 367/369] Fix ref source removal on object destruction --- .../typed_properties_093.phpt | 31 ++++++++++++++++ .../typed_properties_094.phpt | 36 +++++++++++++++++++ Zend/zend_objects.c | 11 +++--- 3 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_093.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_094.phpt 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 000000000000..7335d656b26f --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_093.phpt @@ -0,0 +1,31 @@ +--TEST-- +Typed property assignment by ref with variable name +--FILE-- +$name =& $ref; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test); + +?> +--EXPECT-- +Typed property Test::$prop must be int, string used +object(Test)#2 (1) { + ["prop"]=> + NULL +} 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 000000000000..0fbcb7ef5585 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_094.phpt @@ -0,0 +1,36 @@ +--TEST-- +Edge cases relating to reference source tracking +--FILE-- +prop; +unset($b); +$r = "foo"; // ok + +class A2 { + private int $prop = 42; + + public function &getRef() { + return $this->prop; + } +} +class B2 extends A2 { + public $prop; +} + +$b2 = new B2; +$r2 =& $b2->getRef(); +unset($b2); +$r2 = "foo"; // ok + +?> +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index c6dd952cb0d0..d3079c175255 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -59,13 +59,10 @@ ZEND_API void zend_object_std_dtor(zend_object *object) do { if (Z_REFCOUNTED_P(p)) { 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 == object->ce && p == OBJ_PROP(object, 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(); + 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); } From 93609556b33c724703ac4a2da89b39fafc16faae Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 7 Jan 2019 12:14:13 +0100 Subject: [PATCH 368/369] Assert that all type sources have been removed when ref is dtored --- Zend/zend_variables.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index c057390700fb..d6e72362435a 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -70,6 +70,7 @@ static void ZEND_FASTCALL zend_string_destroy(zend_string *str) static void ZEND_FASTCALL zend_reference_destroy(zend_reference *ref) { + ZEND_ASSERT(!ZEND_REF_HAS_TYPE_SOURCES(ref)); i_zval_ptr_dtor(&ref->val); efree_size(ref, sizeof(zend_reference)); } From 5f7d3769676d04160f83d9df9e08c1b24a49095a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 7 Jan 2019 12:19:56 +0100 Subject: [PATCH 369/369] Use get_property_info_for slot while unsetting properties as well --- Zend/zend_object_handlers.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 9fa9988778a4..8f667628dd05 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -1075,8 +1075,8 @@ ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_s if (Z_TYPE_P(slot) != IS_UNDEF) { if (UNEXPECTED(Z_ISREF_P(slot)) && Z_REFCOUNT_P(slot) > 1) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(zobj->ce, name, cache_slot); - if (UNEXPECTED(prop_info != NULL)) { + zend_property_info *prop_info = zend_get_property_info_for_slot(zobj, slot); + if (UNEXPECTED(prop_info->type)) { ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(slot), prop_info); } }