From d5e097ef64b158422ea9c3efbc5fdc1fe4224b67 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sat, 5 Mar 2016 19:36:43 +0000 Subject: [PATCH 001/198] 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 5ebfe2cb17822..bce2762f47d30 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 40c814f71dc89..e4fe6e4f13cf3 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 ec771003c0c9d..05a0c29dc4516 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 7cf00a0ebe099..34e96da85f96b 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 ecff23d1cdf9e..6d2d1b7f46cef 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 fd45f6275a1ac..95ec36b82141b 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 de67318bed16c..d42c910fd5603 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 40d75a7d2704c..d2acc59fc24d4 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 48fefd8918179..77174cf4b1c51 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 22e74d6b36f12..3559125a25d3e 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/198] 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 bce2762f47d30..835c259ce98dc 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 d42c910fd5603..482f238b83c46 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 d2acc59fc24d4..294735df7059a 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/198] 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 34e96da85f96b..b27896e7ba15d 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/198] 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 482f238b83c46..faff99b0463de 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 294735df7059a..ddc75d638b45b 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/198] 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 835c259ce98dc..a629a5e337162 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 e3ef6a699187d..8952661d8a138 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 faff99b0463de..13842488a2fa1 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 ddc75d638b45b..50892bc548bb1 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/198] 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 0000000000000..054fc4df3ba69 --- /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 0000000000000..a046d792ca8ac --- /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 0000000000000..b2743a9adcee0 --- /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 0000000000000..668b518d82aef --- /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 13842488a2fa1..8528008f64b8c 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 50892bc548bb1..6a89f40566a0a 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/198] 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 a629a5e337162..fa76883c70831 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/198] 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 fa76883c70831..cd542a6ffc677 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 8528008f64b8c..381736faa9602 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/198] 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 668b518d82aef..46780660c04e2 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/198] 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 0000000000000..1b2d7f4849f6a --- /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/198] 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 cd542a6ffc677..96ca7edf0dddd 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 e4fe6e4f13cf3..b25ef861cf20c 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 b27896e7ba15d..cbda5c1937f8e 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/198] 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 381736faa9602..4bd002e1706d9 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 6a89f40566a0a..ca1d504015a6a 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/198] 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 4bd002e1706d9..d0c1baa149baa 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 ca1d504015a6a..1946bedd0b200 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/198] 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 46780660c04e2..b56f773194441 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 1b2d7f4849f6a..21932471d7575 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 d0c1baa149baa..b7cb592f4c44f 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 1946bedd0b200..9c8fabf9cbc5c 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/198] 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 0000000000000..2e775395c43e7 --- /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 0000000000000..a0cd72268d11a --- /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 8952661d8a138..c6f1bd09eb0b8 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 9c8fabf9cbc5c..7a6bc94b3eb06 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/198] 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 c6f1bd09eb0b8..bebc27edc7be4 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/198] 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 bebc27edc7be4..3911d4532ca75 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/198] 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 3911d4532ca75..a405020dbd4be 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 bbe43b0ccda8b..37a912fc2ac42 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 b7cb592f4c44f..4350e952e6ac7 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 7a6bc94b3eb06..ffea52049dafa 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/198] 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 0000000000000..0efff906fa836 --- /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 a405020dbd4be..98ead9a2aed22 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/198] 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 6540f82c6b3c1..92a1ba2e78d99 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/198] 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 4350e952e6ac7..fe311dcaadb17 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 ffea52049dafa..a6677e0cd7e77 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/198] 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 0000000000000..75c3521cf651b --- /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/198] 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 fe311dcaadb17..bd26f6f5e2a48 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 a6677e0cd7e77..32cd8f38013f5 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/198] 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 0000000000000..8506792f37e60 --- /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 0000000000000..ed9db44c69439 --- /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 0000000000000..47122ab762eb5 --- /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 bd26f6f5e2a48..75b6ed7907209 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 32cd8f38013f5..e12ad5b096096 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/198] 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 c66f8ad7c3f57..457e25fa631dc 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 75b6ed7907209..7a056230e0944 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 e12ad5b096096..13e20f5a9e5dc 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/198] 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 92a1ba2e78d99..64df7e95f862b 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/198] 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 98ead9a2aed22..0a8c339cd4038 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/198] 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 96ca7edf0dddd..f70b1a736da1d 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 cbda5c1937f8e..61faf20fccc5c 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/198] 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 0000000000000..1bf8a6289ba62 --- /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 0000000000000..c9fb16304038b --- /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 0000000000000..3a1fb8f12af3a --- /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 0000000000000..5938af1f88291 --- /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 f70b1a736da1d..66d9cabfb9627 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/198] 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 66d9cabfb9627..5350abaeaa086 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/198] @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 61faf20fccc5c..bc71fd21ce443 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/198] 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 a046d792ca8ac..facaee077e0b4 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 b2743a9adcee0..36337b3066afd 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 b56f773194441..59314ab8dad1f 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 21932471d7575..05de2251c9724 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 75c3521cf651b..caa435a02c2ee 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 8506792f37e60..c11e9284a517e 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 ed9db44c69439..d958ec23d2093 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 47122ab762eb5..d3a1f845cab78 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 1bf8a6289ba62..499ed855121aa 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 c9fb16304038b..af9d5c5a2746a 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 3a1fb8f12af3a..15643ca2a7bff 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 5350abaeaa086..2450fcd0a1370 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 7a056230e0944..fdcb32321caea 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 13e20f5a9e5dc..f594a7b6bf7b9 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/198] 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 6d2d1b7f46cef..3abc80adce174 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 fdcb32321caea..8953052353556 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 f594a7b6bf7b9..6cba494e5e0f9 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/198] 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 2450fcd0a1370..c6a3b6a24ac89 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 77174cf4b1c51..d2efa13d649b4 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/198] 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 8953052353556..c998c3a90bdd3 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 6cba494e5e0f9..fc15b368b855a 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/198] 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 0000000000000..4d344b93fed9b --- /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 bc71fd21ce443..973a850be65ba 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/198] 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 c998c3a90bdd3..896548c242f3d 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 fc15b368b855a..6d1ced76d231d 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/198] 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 499ed855121aa..b6e297df47116 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 c6a3b6a24ac89..c7e537998a95b 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 896548c242f3d..2402d1be2058a 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 6d1ced76d231d..4d836c9747d45 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/198] 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 c7e537998a95b..3cf7f067d364f 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 de5875fdba68e..7e5fe00e85e58 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 00c651fdfe90a..7b885439c2b17 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 0a8c339cd4038..5750e0a2f7a5e 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 37a912fc2ac42..1ea0aa68f7184 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 2402d1be2058a..aac350be0537a 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 4d836c9747d45..29d560a1fba0f 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/198] 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 15643ca2a7bff..088e45d091ffd 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 3cf7f067d364f..0bdc3706a741d 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 7e5fe00e85e58..82632d8b0ea5f 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 7b885439c2b17..133ace955d023 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 aac350be0537a..b7bd4bad44eba 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 29d560a1fba0f..f772262c10051 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/198] 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 82632d8b0ea5f..ebed2d7efd733 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/198] 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 5750e0a2f7a5e..fcf5861be0564 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/198] ... --- 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 1ea0aa68f7184..0a3e380e0e608 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 b7bd4bad44eba..87ebb3e00cad7 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 f772262c10051..9db51b649a8a8 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/198] 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 ebed2d7efd733..033eebf423691 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/198] 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 0000000000000..621e176507582 --- /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 973a850be65ba..0803ab13a5a12 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/198] 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 87ebb3e00cad7..bf5c7a49b696a 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 9db51b649a8a8..8905c98a67668 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/198] 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 fcf5861be0564..ea66986e5c6b0 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/198] 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 bf5c7a49b696a..b4d03dd211a82 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 8905c98a67668..b9c9a7170f1ab 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/198] 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 b4d03dd211a82..d74f84afc9fab 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 b9c9a7170f1ab..081c00938e01e 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/198] 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 0000000000000..906ea1cf9d08b --- /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 d74f84afc9fab..aff7c2c16735e 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 081c00938e01e..8eb66725448d8 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/198] 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 caa435a02c2ee..5d749522d6f5d 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/198] 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 033eebf423691..ac0f4a68440d6 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/198] 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 aff7c2c16735e..797aef8456f5c 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 8eb66725448d8..0b1a65fc59aa7 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/198] 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 0000000000000..c73b3bebff48c --- /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/198] 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 c73b3bebff48c..856a4fce86bcc 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 797aef8456f5c..4503a65347f6d 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 0b1a65fc59aa7..f0e0d7bd12c61 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/198] 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 856a4fce86bcc..131412b21a213 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/198] 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 131412b21a213..fc1d6e13930fe 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/198] 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 0bdc3706a741d..6fa31e1a96844 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/198] 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 0000000000000..dcd21c9adc3e0 --- /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/198] 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 dcd21c9adc3e0..b3e3fa0887248 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/198] 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 6fa31e1a96844..5dea8f17934e4 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/198] 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 5dea8f17934e4..1cc7fda8bb62a 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/198] 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 0000000000000..b99eef98f20e6 --- /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 1cc7fda8bb62a..d687fb598daf0 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 0803ab13a5a12..a72909e263e33 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 ac0f4a68440d6..d0715904e985e 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/198] 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 a72909e263e33..f212097c47b6d 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/198] 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 0000000000000..d38fe249534b2 --- /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 ea66986e5c6b0..c5d1eeb3e37f2 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 4503a65347f6d..5e86b161275b4 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/198] 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 64df7e95f862b..3b9356461b986 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/198] 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 fc1d6e13930fe..78a7bf4e4aded 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 b3e3fa0887248..79a5d70098e41 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 4b62012359f6e..1aa23f301fdfd 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 b99eef98f20e6..ce6aa53c13876 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/198] 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 5e86b161275b4..c8b5b9b6fef33 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 f0e0d7bd12c61..f03a94eb9a69d 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/198] 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 c70245821f95f..f60525536f38c 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 0000000000000..7979a33898e66 --- /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 f212097c47b6d..e87c212e94c4c 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/198] 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 68aa136d90de4..904844ed0e269 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 f764cf1519d92..015525aa66e6b 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/198] 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 904844ed0e269..b92bfdedc44bf 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/198] 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 015525aa66e6b..fe6b9891480ea 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/198] 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 b92bfdedc44bf..451a6e77d1013 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 fe6b9891480ea..01fdd948824db 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/198] 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 0000000000000..62e0d8bc62b12 --- /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 c5d1eeb3e37f2..da70ce4851ff1 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/198] 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 da70ce4851ff1..5086720ac4bf3 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/198] 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 62e0d8bc62b12..250ea060508c3 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 5086720ac4bf3..bc11a0a38c9ec 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/198] 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 0000000000000..9cb7c078173e9 --- /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 d0715904e985e..b02d54893e628 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/198] 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 ddccec909098a..177200ada7e39 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 fe72459bec7b7..48486078afb60 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 0e8f7202a55cf..db880ceed0c78 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 78a7bf4e4aded..5df6d89bd084f 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 9cb7c078173e9..7509f89b1b80f 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 0000000000000..de1b3f660232a --- /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 0000000000000..9e27d74d97bd6 --- /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 d687fb598daf0..ebb7805b471d9 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 e87c212e94c4c..96f0463b5aada 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 b02d54893e628..54643e1e659f8 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 133ace955d023..5727442316ab3 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 c8b5b9b6fef33..4f790fc31c2c3 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 f03a94eb9a69d..e1a34cdd88bf4 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/198] 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 5df6d89bd084f..95d4d5b608847 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 4f790fc31c2c3..a814d0f9d1f09 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 e1a34cdd88bf4..1cfcc5c478d74 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/198] 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 89a20b322d5d6..c869765e903ea 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 90a5c5b42b498..94605d49a505b 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 18c5e36addeb4..74c6cc3fb0226 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/198] 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 6346857478250..2717781dc59af 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 07768e9cb1cfb..ed8fecc678f7a 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/198] 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 5d749522d6f5d..9c0b1ff26d7de 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 457e25fa631dc..5c4fb3e107852 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 2717781dc59af..b29d0c04347b8 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 ed8fecc678f7a..a7201a92b00c2 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/198] 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 0000000000000..2749948a6839b --- /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/198] 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 2586bcbfa143d..1ae8b251b07d4 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 5727442316ab3..1e309dc1d8ac1 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 b29d0c04347b8..7ec9a54027610 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 a7201a92b00c2..3ef51484e8a24 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/198] 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 a7bec8a75b4c3..e9149e1c1c79f 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 0000000000000..8022d2ef72bca --- /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 1ae8b251b07d4..038e1f93f0eaa 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 7ec9a54027610..b1613ec6bb15a 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 3ef51484e8a24..f9e5c34017e4e 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/198] 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 038e1f93f0eaa..b855df1756a65 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 1e309dc1d8ac1..f0ef398e3638d 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 b1613ec6bb15a..16e1552048ddb 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 f9e5c34017e4e..b169cb12c3f7e 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/198] 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 b855df1756a65..dbcc43acf5d5d 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 f0ef398e3638d..ed61d6f8cbb30 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 16e1552048ddb..9d27b63d589e3 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 b169cb12c3f7e..583ce733427be 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/198] 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 3ef8eceb5f15f..b13d782637283 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 9d27b63d589e3..2db5d203208f6 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 583ce733427be..dabf976f06532 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/198] 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 2db5d203208f6..adaefcd32d179 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 dabf976f06532..791ac6ae4e70a 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/198] 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 adaefcd32d179..d7d22c8bb3e1e 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 791ac6ae4e70a..45f2eaf3b0541 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 d2efa13d649b4..34bdcfdbf2b33 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/198] 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 dbcc43acf5d5d..893e597265640 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/198] 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 d7d22c8bb3e1e..06adce685e332 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 45f2eaf3b0541..6be802694e552 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/198] 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 06adce685e332..da46f324fa010 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 6be802694e552..e59785de39163 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/198] 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 da46f324fa010..3dfc238509601 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 e59785de39163..2a16add7cb18c 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/198] --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 3dfc238509601..d9b4cb7f708eb 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 2a16add7cb18c..d72039a82abba 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/198] 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 0000000000000..84b2823fb1cb6 --- /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 d9b4cb7f708eb..09cf835583ce7 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 d72039a82abba..71624c8f85512 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/198] 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 09cf835583ce7..8d73824fd6412 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 71624c8f85512..a526477ea1aa1 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/198] 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 0000000000000..11eaa1ac8bd1e --- /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 8d73824fd6412..50ed50a5770bb 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 a526477ea1aa1..757733eab0d7e 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/198] 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 0000000000000..64a6c5d8deaae --- /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 50ed50a5770bb..580ffb7b0cb3a 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 757733eab0d7e..24622a3b650da 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/198] 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 f6b8ff97ec1c4..3289e6b5058ff 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/198] 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 0000000000000..3ad55e2bcf43e --- /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/198] 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 3289e6b5058ff..d122ebadfa00a 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/198] 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 d122ebadfa00a..5b390627da5fb 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 ed61d6f8cbb30..e5c136c443885 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 580ffb7b0cb3a..36fdf2fb4fa4d 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 24622a3b650da..87c9b1c5c7e12 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/198] 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 5b390627da5fb..cccd82edfdb18 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 17443f246a91d..8629badad9f48 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 22fa55ca4f84c..34284339d59c9 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/198] 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 0876b0a1988fb..a000c4a0ecd1d 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 cccd82edfdb18..24fbd3fc12c73 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 62b26d694421c..a17e911e5e200 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 8629badad9f48..0e45b8fa1b009 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 34284339d59c9..c44587c7dec3c 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 76c89fe828c3e..ace0e8714b59e 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 42c608416f0dd..2ace91b0318f9 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/198] 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 0000000000000..5ae25d6c9826b --- /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 24fbd3fc12c73..70eca4941e488 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 e5c136c443885..28889c35b730f 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 0e45b8fa1b009..51a1e835d5ad2 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 c44587c7dec3c..c4270b0bde01d 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/198] 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 28889c35b730f..c0ff23dd0eebc 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 dc2ce46a7b903..99c6475d4a56a 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 51a1e835d5ad2..e03afc10e1e77 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/198] 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 f60525536f38c..54fd38dc91648 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 7979a33898e66..70156de35b8f6 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 5ae25d6c9826b..4048e370f3681 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 3b9356461b986..cb1569910625f 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 05a0c29dc4516..4943344112116 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 a000c4a0ecd1d..99ea72a8d7e63 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 efb0fffa5d39b..ffa06b9d4d2b1 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/198] 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 70eca4941e488..66ff707512081 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 e03afc10e1e77..c6d9e90d6c747 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 c4270b0bde01d..ed9f52701ce89 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/198] 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 c6d9e90d6c747..ed58d6a23b1bc 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 ed9f52701ce89..346f368c48f47 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/198] 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 0000000000000..8bdd6748b2e96 --- /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 bc766990703e5..a7a70637f7660 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/198] 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 a7a70637f7660..dc0f2edb8108b 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/198] 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 be4a82c3a7258..f3d7316e19cf0 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 a17e911e5e200..d73f67643fdf8 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 3adde16412058..e104ec6e29428 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 195679e346796..c4a5b40c2d9d4 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/198] 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 0000000000000..9673d411d1b76 --- /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/198] 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 9673d411d1b76..d25d2fc1a9061 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/198] 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 7509f89b1b80f..f8cea4c764c51 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/198] 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 d73f67643fdf8..bb4ee986b32a5 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/198] 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 bb4ee986b32a5..1cb6ffc92302e 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/198] 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 1cb6ffc92302e..c101b4e7fcee7 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/198] 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 f3d7316e19cf0..e1f987ecf3448 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 e104ec6e29428..6007619ca3ef7 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 c4a5b40c2d9d4..e8d934760a2e1 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/198] 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 6007619ca3ef7..7e3437c084b3c 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 e8d934760a2e1..0308a60586cfa 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/198] 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 e1f987ecf3448..8906b05aa00de 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/198] 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 8906b05aa00de..30fde391cbebd 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/198] 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 30fde391cbebd..f0685c0449679 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/198] 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 7e3437c084b3c..69db9511abb70 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 0308a60586cfa..3fdec9511170e 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/198] 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 c101b4e7fcee7..cc423e74d69e1 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 69db9511abb70..fe5fa525c320f 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 3fdec9511170e..c15b9f06683ff 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/198] 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 95d4d5b608847..03fdd714b536b 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 f0685c0449679..b648ea311d60f 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/198] 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 cc423e74d69e1..861c744d41874 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/198] 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 b648ea311d60f..3d32767097724 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/198] 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 3d32767097724..25bfa3f4d3138 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/198] 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 25bfa3f4d3138..3eb27ac8f22a2 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 2d20865cf90bb..b853f4fa5618e 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 5207386ccf5e3..ec6b399e363bd 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/198] 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 b853f4fa5618e..fc71c9dd5c48d 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/198] 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 3eb27ac8f22a2..be80ba0482cd8 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 ec6b399e363bd..c5733160ca20d 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 fe5fa525c320f..7ff6e0a959eb0 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 c15b9f06683ff..aa228a737d840 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/198] 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 be80ba0482cd8..1cb0b2446cd2c 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 7ff6e0a959eb0..c9f87cd3daa3c 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 aa228a737d840..d2bfe3d906fdc 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/198] 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 5c74f5fb4a7bd..defe119fd70f7 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/198] 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 defe119fd70f7..58a5edf4827ab 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/198] 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 58a5edf4827ab..36f599a8d1e5d 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/198] 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 0000000000000..2b2513bd925b8 --- /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 36f599a8d1e5d..fbd4d0d527652 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 07e37b45ff21c..19d6f8ea27e6d 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 a15c8b6c5cb58..375db9d99f868 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 7a0bb3f0bfac2..4f77576ba6041 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 1f8932edfa9b1..7d28e106a1327 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/198] 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 4f77576ba6041..b7d2bd94a2256 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 7d28e106a1327..4b511cfbf7be7 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/198] 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 36337b3066afd..90ee16c613236 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 9c0b1ff26d7de..c4c34dc810626 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 4048e370f3681..e98c8817a6963 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 0000000000000..075fbb1eacfa5 --- /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 d1a33ef54ee96..59d0dd950810a 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 fbd4d0d527652..803a678322501 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 19d6f8ea27e6d..e54e0aafc272f 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 375db9d99f868..e625c970949e9 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 81ca927864a61..45c2ebdf70a69 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 b7d2bd94a2256..431b1fd53ef3f 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 4b511cfbf7be7..6375301222d67 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 9c55bd48fd33f..3041ca0f8cfe8 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/198] 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 59d0dd950810a..4ac3f8b5865a5 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 803a678322501..402104be4a1a6 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 e625c970949e9..a55e54ef4c0a9 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 f887903f268e9..47d0677949831 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 e37bca31d6ddb..674f2aadc3ec5 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 0000000000000..e6b09214be2c2 --- /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 3041ca0f8cfe8..5c40f11824087 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 3fc074dd6ae2c..a776e8a404a28 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 81cc26db9d11a..bfc8a359ba6bc 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/198] 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 431b1fd53ef3f..77d17cc273827 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 6375301222d67..a61213a557553 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/198] 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 054fc4df3ba69..5a346a4c3e80a 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 59314ab8dad1f..1d9e6400e00fd 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 05de2251c9724..b521963000d52 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 64a6c5d8deaae..dc6d58170d000 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 4ac3f8b5865a5..43cfd4b94c912 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 1c4f619f1f99e..fb40acd6bf01a 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 c5116ed699c41..210166847894c 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 402104be4a1a6..454d29751ec48 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 e54e0aafc272f..ffd3c936e246f 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 1403e19858953..a70ae05c88c61 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 0ff48147ebe17..d14d190b83e5b 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 d57e488166fae..4939051d0941e 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 77d17cc273827..f7b5f35f75c80 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 0f2c3feb73003..3150c7d951578 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 01fdd948824db..158ecb6b5ef62 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 e6b09214be2c2..a05a8e53af51b 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 5c40f11824087..f5b57862ca104 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/198] 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 454d29751ec48..816fcc364f865 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 f7b5f35f75c80..f98a8478dbd4f 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 a61213a557553..76ad23d7abcd8 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/198] 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 a55e54ef4c0a9..a7c141479367f 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/198] 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 f8cea4c764c51..03ce2f15893e5 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 a7c141479367f..ffe2efe44b873 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/198] 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 0000000000000..fdaeab6a6c118 --- /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 0000000000000..ef07d1aef3531 --- /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/198] 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 0000000000000..be64f744220c7 --- /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/198] 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 b13d782637283..3ef8eceb5f15f 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 be64f744220c7..3dc96e25166c7 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 f98a8478dbd4f..97c36bb12b7b6 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 76ad23d7abcd8..73c7c69763b0d 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/198] 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 0000000000000..6218564bf88b3 --- /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 97c36bb12b7b6..1992047d2069a 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 73c7c69763b0d..56e8166e986b9 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/198] 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 1992047d2069a..7f61c530cf7b7 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 56e8166e986b9..d28972d61a2a6 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/198] 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 7f61c530cf7b7..c4cda82fa8caa 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 d28972d61a2a6..9d08dcaf49769 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/198] 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 0000000000000..8c160a98e75b9 --- /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 ffe2efe44b873..77b68d0b23204 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 c4cda82fa8caa..537d307fe8d27 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 9d08dcaf49769..66cf46cb3ef2d 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/198] 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 c4c34dc810626..83ccfcf515e4c 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/198] 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 ac766253740a8..857937df18dde 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/198] 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 857937df18dde..334399c2629a9 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 537d307fe8d27..b06aaeea012e4 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 66cf46cb3ef2d..144a5fd43fe5b 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/198] 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 77b68d0b23204..3d71e34755228 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/198] 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 0000000000000..dc592769fa123 --- /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 0000000000000..b0a7517e86ce6 --- /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 43cfd4b94c912..d992b953b72c2 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 6953d192554e0..805dd89cc7152 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 210166847894c..446af602d6ea2 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 e08f589508d7c..2be03716e3182 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 334399c2629a9..b2a7ad614ab02 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 d14d190b83e5b..5ebf38b73fe8b 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 f5b57862ca104..16e05cd765261 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/198] 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 0000000000000..2e0b068f3beef --- /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/198] 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 0000000000000..cc3d1358c3df0 --- /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 3d71e34755228..609739c236a2f 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 b06aaeea012e4..dfc0da11e063a 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 144a5fd43fe5b..6dd548184eccf 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/198] 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 ec3dac04b466d..2b4aa94b04687 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 8ce50e2b5ae96..66f546d627d33 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 25488461e5175..efc5504a4d083 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/198] 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 cc3d1358c3df0..3fa826083e131 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/198] 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 0000000000000..1556eabe49ce7 --- /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 d992b953b72c2..885b0ffb9cf5a 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 6fc3b5f3148b5..7590e8680d36f 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 ffd3c936e246f..50a1645154fbd 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 2b4aa94b04687..5daaeae963859 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 66f546d627d33..0182b5b5315e5 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 efc5504a4d083..fc41a0dcc8606 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 a776e8a404a28..7879d977b6ce7 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 bfc8a359ba6bc..8cd6b40a1bf58 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/198] 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 dc592769fa123..d3bdc239c5738 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 b0a7517e86ce6..0bdb0f602f77c 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 885b0ffb9cf5a..73db276aedfaf 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 5daaeae963859..53e41993ddb51 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/198] 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 80d6b016e89c8..77259abe2a833 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/198] 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 0182b5b5315e5..f97c1ac2b9469 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 fc41a0dcc8606..016b2f99f40dc 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/198] 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 f97c1ac2b9469..29e3cf373a97f 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 016b2f99f40dc..839dc42f40936 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/198] 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 0000000000000..8958735dbba17 --- /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 fb40acd6bf01a..f80a0c97bc855 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/198] 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 f80a0c97bc855..599ecba0ee6ee 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/198] 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 0000000000000..418db0e37cf81 --- /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/198] "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 0000000000000..6fb25191dd147 --- /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 0000000000000..9155bcc124b66 --- /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 24a96214c3e7d..949da442523ce 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/198] 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 50a1645154fbd..7aa329b3f12e9 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/198] 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 90ee16c613236..cf85fc4093120 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 949da442523ce..6b657d70570bb 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 37cef5d382145..4609d746dadfd 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 7590e8680d36f..ad58d1751e430 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 53e41993ddb51..8092a81b38b0e 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 29e3cf373a97f..e931aa2852035 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 839dc42f40936..d0ecee77c55ad 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/198] 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 7aa329b3f12e9..f670eeb78da39 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 8092a81b38b0e..898b4ec398330 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 16e05cd765261..614c35a3638d1 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/198] 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 0000000000000..16c958acf33dc --- /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 6b657d70570bb..3505b185bd736 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 4609d746dadfd..1b23eed78013b 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 ad58d1751e430..88e392d95b942 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 e931aa2852035..182d1ba4775c0 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 d0ecee77c55ad..f8d9545d3fcc9 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 03d9817c6be4c..9e2944ad1e5fb 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 5463f9c498863..9ea4d2100d12a 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 4f5a0d615a27d..a3c7a3b9e40fb 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 c306c7ac1e3fc..9429156b8713c 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/198] 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 88e392d95b942..81e2e98f80b5d 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/198] 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 0000000000000..e6d6e6338e1e3 --- /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/198] 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 0000000000000..4b98dd18f3484 --- /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/198] 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 0b5fe75ff8b06..ade3ba7c460d6 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/198] 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 0000000000000..18fae533a038f --- /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 73db276aedfaf..799d4624d8342 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/198] 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 18fae533a038f..2be5aa7aba8df 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 799d4624d8342..379f8c4705b77 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/198] 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 81e2e98f80b5d..a4a800adbb5aa 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/198] 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 4b98dd18f3484..fefe8d0738d74 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 182d1ba4775c0..d7fc6f603e889 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 f8d9545d3fcc9..e7b5177d7f23a 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/198] 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 c4b91ce31aa03..77f054d543590 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 a9a82a68afc04..dba10e3564687 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/198] 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 77f054d543590..269a0489e208b 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/198] 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 fdaeab6a6c118..0d1f45943aac5 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 ef07d1aef3531..cd4e680ef641a 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 1556eabe49ce7..1c8673d0d3d44 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 e6d6e6338e1e3..4fc7b014b2a93 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 8958735dbba17..61268fdf91f33 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 a4a800adbb5aa..8dc573ae5d022 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 d7fc6f603e889..8c78af0a226e3 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 e7b5177d7f23a..baf6b35b5f991 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/198] 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 8dc573ae5d022..136b905b6333c 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 f670eeb78da39..c8a14ac2c61e3 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 8c78af0a226e3..89c080cdaf51e 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 baf6b35b5f991..0dfe79f5d9ae5 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/198] 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 3150c7d951578..6fc340f448436 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/198] 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 47d0677949831..f887903f268e9 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 674f2aadc3ec5..e37bca31d6ddb 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 4afefbe95aef9..7185767d1b2f7 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 614c35a3638d1..47339161747b5 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 7879d977b6ce7..edb122ab2711d 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 8cd6b40a1bf58..d65ddb948e8f5 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/198] 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 405ca0926f5cd..370502282df0d 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/198] 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 0000000000000..e0c6d4d5ad271 --- /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 5ebf38b73fe8b..da2343138ff23 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/198] 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 379f8c4705b77..289b1b31b3bc0 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 3505b185bd736..b730d77b81a4b 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/198] 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 136b905b6333c..6fa5e7bd141b8 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/198] 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 c8a14ac2c61e3..9aea0bd570c0c 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 898b4ec398330..3639a9de5e0f0 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 47339161747b5..e46c7db4847f6 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/198] 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 0000000000000..b1d16bd3c6bec --- /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 da2343138ff23..0b82707668c6d 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/198] 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 6fb25191dd147..45255ef9e9627 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 eaef4212b61ac..e6fbf355ff0f0 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 cffd8cbcb00f0..af43cb1f23a98 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 599ecba0ee6ee..a0f6c19165845 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 021b297e3164f..70a65a492a9c6 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 81f6d02f1d656..b10f96922c038 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/198] 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 d3bdc239c5738..fdd547333a6ab 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 0bdb0f602f77c..59ca7e3bd427c 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 3639a9de5e0f0..227871c115f2a 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/198] 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 0b82707668c6d..09ef7ed129c5c 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))) {